自定义插件选项不会更新

时间:2017-12-08 作者:armadadrive

我们为客户端编写了一个小的自定义插件,以获取一些自定义选项(在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:添加了更多显示会话变量和选项设置的代码段

1 个回复
SO网友:signal2013

您是否确认是瞬态值导致选项不更新?

以下是清除瞬态值的WordPress函数:https://codex.wordpress.org/Function_Reference/delete_transient

例如:

<?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\' );
?>
您可以在数据库中搜索要删除的临时条目的名称(注意,您可能还想验证edit\\u term挂钩是否足以调用delete\\u transient函数。您的代码中还可以有其他优化点来调用此函数。)

**您也可以检查https://docs.woocommerce.com/document/shipping-method-api/ 有关如何操作WooCommerce配送选项的信息。

结束

相关推荐

要将wp_Options数据库数组转换为javascript对象吗?

在我的WP代码中,我获取了我的选项信息$options = get_option(\"kaipo_plugin_options\");我打印出来的数组如下所示a:2:{s:20:\"Kaipo_banner_heading\";s:5:\"hello\";s:10:\"Kaipo_logo\";s:61:\"http://nzbaddystore.com/wp-content/uploads/2015/04/images.jpg\";} 我想将此数组动态转换为javascript对象?有什么建议