我们为客户端编写了一个小的自定义插件,以获取一些自定义选项(在WP仪表板中设置),用于计算Woocommerce中的自定义运输成本。
现在的问题是,对管理面板选项的更改似乎没有反映在签出中。“旧”(以前)值正在使用中。
下面是一个片段,展示了我们如何设置这些选项(在插件的主菜单中.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 echo $options[\'vds_pick_base_rate\']; ?>\'>
<?php
}
我在初级/中级阶段很难找到关于瞬变和选项缓存如何工作的好信息,所以我的问题是,
how can I flush those options anytime a change is made in the dashboard and should this be done at the plugin level on page load or through some other mechanism? 一旦我们交出网站,我们就不能指望它的所有者手动清除任何缓存的东西。
这是我们用来在字段更新时通过AJAX更新发货总额的挂钩,等等。
add_action(\'woocommerce_checkout_update_order_review\', \'update_shipping_costs\');
以及在该回调中运行的示例函数,该函数获取并设置上面定义的速率:
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\\_%\')");
在这个回调的后面,我们有一些助手函数。这是其中之一:
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);
}
这显然不是完整的插件文件,但您可以看到,我们显然要求
vds_settings
在仪表板中设置。然而,它们并没有反映出变化。
您可能会在评论中注意到,我们知道query
有点核。但在没有更好地理解WP中的瞬态和选项的情况下,我们借用了外包的部分功能代码。那个开发人员移动了,我们失去了联系,所以我们决定进行完全重写,并将临时删除查询留在那里,因为我们知道他在缓存/临时对象方面有问题。
我们不认为这是Woocommerce的问题,因为发货和结帐流程是有效的——这是来自get_options
当我们玩它们并刷新结账时,这似乎没有改变。
我们很早就遇到了一些问题,人们来到结账页面,看到上一个会话的运费已经在那里了,所以我用这个来抨击他们(但我认为这不应该影响更新值的检索):
// 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);
}
选项本身就是这样设置的,它会在仪表板中显示它们,但奇怪的是,我在使用phpMyAdmin手动浏览数据库时没有看到它们:
function vds_options_page() {
?>
<form action=\'options.php\' method=\'post\'>
<h2>Distance Shipping</h2>
<?php
settings_fields(\'pluginPage\');
do_settings_sections(\'pluginPage\');
submit_button();
?>
</form>
<?php
}
编辑:添加了一组代码,希望能更好地说明这种情况!编辑2:添加了更多显示会话变量和选项设置的代码段