Benutzerdefinierte Plugin-Optionen werden nicht aktualisiert

Wir haben ein kleines benutzerdefiniertes Plugin für einen Client geschrieben, um einige benutzerdefinierte Optionen (im WP-Dashboard festgelegt) zu verwenden, die zur Berechnung der benutzerdefinierten Versandkosten in Woocommerce verwendet werden.

Das Problem ist, dass Änderungen an den Optionen des Admin-Steuerfelds sich nicht im Checkout widerspiegeln. Die “alten” (vorherigen) Werte werden verwendet.

Hier ist ein Ausschnitt, der zeigt, wie wir diese Optionen einstellen (in der .php unseres Plugins .php ):

 add_action('admin_init', 'vds_settings_init'); function vds_settings_init() { register_setting('pluginPage', 'vds_settings'); add_settings_field( 'vds_pick_base_rate', __('Pick n Dropp Base Rate', 'wordpress'), 'vds_pick_base_field_render', 'pluginPage', 'vds_pluginPage_section' ); ... /** Other settings fields are defined... **/ ... function vds_pick_base_field_render() { $options = get_option('vds_settings'); ?> <input type='text' name='vds_settings[vds_pick_base_rate]' value=''> <?php } 

Ich hatte Schwierigkeiten, gute Informationen darüber zu finden, wie Transienten und Options-Caches von Anfänger- bis zu Fortgeschrittenen-Levels funktionieren – meine Frage ist also, wie kann ich diese Optionen löschen, wenn im Dashboard eine Änderung vorgenommen wird und dies auf der Ebene des Plugins geschieht beim Laden der Seite oder durch einen anderen Mechanismus ? Sobald wir die Seite freigegeben haben, können wir nicht erwarten, dass ihr Besitzer jedes zwischengespeicherte Material manuell wegbläst.

Dies ist der Haken, den wir verwendet haben, um die Versandsummen über AJAX zu aktualisieren, wenn Felder aktualisiert wurden usw.

 add_action('woocommerce_checkout_update_order_review', 'update_shipping_costs'); 

Und eine Beispielfunktion, die in diesem Callback läuft und die oben definierten Raten abruft und setzt:

 function update_shipping_costs($post_data) { // Clear transients to make sure shipping is re-calculated // The transients were apparently causing problems with a freelancer and he had used this nuclear option to get rid of them. We left it in as we assumed it helped. global $wpdb; $wpdb->query("DELETE FROM `$wpdb->options` WHERE `option_name` LIKE ('%\_transient\_%')"); 

Weiter unten in diesem Callback haben wir einige Hilfsfunktionen. Dies ist einer von ihnen:

 function set_distance_rate($vd_dist) { $vds_options = get_option('vds_settings'); foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item) { $product = $cart_item['data']; // Use of the max function ensures our shipping rate is at least $5 if (has_term('courier', 'product_cat', $product->id)) { $vd_rate = max($vds_options['vds_pick_base_rate'] + ($vd_dist * $vds_options['vds_pick_multiplier']), 5); } else { $vd_rate = max($vds_options['vds_shop_base_rate'] + ($vd_dist * $vds_options['vds_shop_multiplier']), 5); } } WC()->session->set('vdropp_shipping_charges', $vd_rate); } 

Dies ist natürlich nicht die komplette Plugin-Datei, aber Sie können sehen, dass wir eindeutig nach den im Dashboard eingestellten vds_settings fragen. Sie spiegeln jedoch keine Änderungen wider.

Vielleicht bemerken Sie in dem Kommentar, dass wir wissen, dass die query ein wenig nuklear ist. Aber ohne Transienten und Optionen in WP besser zu verstehen, liehen wir sie aus einem teilweise funktionierenden Code, den wir ausgelagert hatten. Dieser Entwickler bewegte sich und wir verloren den Kontakt, also entschieden wir uns für ein vollständiges Neuschreiben und ließen die vorübergehende Löschanfrage dort, weil wir wussten, dass er Probleme mit Cache / transienten Objekten hatte.

Wir glauben nicht, dass es ein Woocommerce-Problem ist, weil der Versand- und Checkout-process funktioniert – es sind die Werte, die von get_options , die sich nicht zu ändern scheinen, wenn wir mit ihnen spielen und den Checkout get_options .

Wir hatten schon früh Probleme mit Leuten, die auf der Checkout-Seite ankamen und bereits dort die Versandkosten einer vorherigen Sitzung sahen, also attackierte ich sie damit (aber ich denke nicht, dass dies Auswirkungen auf das Abrufen aktualisierter Werte haben könnte):

 // Always clear session vars and get new stuff add_action('woocommerce_before_checkout_form', 'clear_session_vars'); function clear_session_vars($a) { WC()->session->set('pickup_postal_code', null); WC()->session->set('delivery_postal_code', null); WC()->session->set('vdropp_shipping_charges', null); WC()->session->set('shipping_total', null); } 

Die Optionen selbst werden mit diesem festgelegt, was sie im Dashboard zeigt, aber seltsamerweise sehe ich sie nicht beim manuellen Durchsuchen der database mit phpMyAdmin:

 function vds_options_page() { ?> 

Distance Shipping

<?php }

EDIT: Ein Haufen Code hinzugefügt, um die Situation hoffentlich besser zu illustrieren! EDIT 2: Es wurden weitere Snippets hinzugefügt, die Session Vars und Optionseinstellungen zeigen

Solutions Collecting From Web of "Benutzerdefinierte Plugin-Optionen werden nicht aktualisiert"

Haben Sie bestätigt, dass die Übergangswerte die Optionen nicht aktualisieren?

Hier ist die WordPress-function zum Löschen transienter Werte: https://codex.wordpress.org/Function_Reference/delete_transient

Ein Beispiel:

 < ?php // Create a simple function to delete our transient function edit_term_delete_transient() { delete_transient( 'the_transient_name_to_delete' ); } // Add the function to the edit_term hook so it runs when categories/tags are edited add_action( 'edit_term', 'edit_term_delete_transient' ); ?> 
  • Sie können in der database nach den Namen der zu löschenden vorübergehenden Einträge suchen.

(Beachten Sie, dass Sie auch überprüfen möchten, ob der Hook edit_term ein ausreichender Ort ist, um die function delete_transient aufzurufen. Sie könnten auch andere optimierte Punkte in Ihrem Code haben, um diese aufzurufen.)

** Sie können auch https://docs.woocommerce.com/document/shipping-method-api/ nachlesen, um zu erfahren, wie Sie die Versandoptionen von WooCommerce manipulieren können.