在没有挂钩的情况下,通过函数.php更改小部件选项

时间:2011-01-11 作者:maduroblanco

The problem: 使用函数中的自定义函数更改小部件的选项。php,当没有有用的挂钩,并且同一个小部件(multiwidget)多次出现时。

这将涉及:

从“wp\\u options”表中的“widget\\u some-widget”检索选项。(返回的选项包含一组设置(以序列化形式),对应于同一小部件的多个唯一事件重复多次。)

更改选项实例的值,例如,调用some_name, 从“旧价值”到“新价值”,另一个叫做some_other_name, 从“一些旧价值”到“一些新价值”。(可能是小部件的每次出现在序列化选项字符串中都有自己的id,可以通过某种方式识别?)

使用更改的选项更新数据库

即沿着这些线的东西-

function change_widget_configuration() {

    $options = get_option(\'widget_some-widget\');

// [code to parse $options string to ensure the correct occurrences of \'some_name\' and \'some_other_name\' have their values changed]

/* third-occurrence of */    $options[\'some_name\'] = \'new value\';
/* third-occurrence of */    $options[\'some_other_name\'] = \'new value\';

    update_option(\'widget_some-widget\', $options);

}
小部件的序列化选项字符串可能如下所示(省略号除外)-

i:3;a:20:{s:5:"title";s:8:"My Title";s:9:"some_name";s:11:"Bit of text";s:15:"some_other_name";s:2:"17"; […]s:14:"more_from_this";s:29:"More articles on this subject";}s:12:"_multiwidget";i:1;}

可以采取什么样的方法(使用上面注释掉的代码)来解决这个问题*

*这对于控制第三方小部件(没有任何有用的挂钩)的输出非常有用,而无需更改其代码,或在函数中重复大块代码。php

2 个回复
SO网友:maduroblanco

经过一些挖掘,我找到了一个解决方案(在评论中解释)-

function change_widget_configuration() {

$options = get_option(\'widget_some-widget\'); // retrieve the options for all occurrences of the named widget*

    $widget_number = 3; // the id number of the specific occurrence of the widget whose options you wish to alter (this can be obtained simply in the html from the <div id=""> tag of the specific widget)

    $sub_options = $options[$widget_number]; // this now contains the options of the specific occurrence of the widget**

        $sub_options[\'some_name\'] = \'new value\'; // change any named option*
        $sub_options[\'some_other_name\'] = \'new value\';

    $options[$widget_number] = $sub_options // pass the changes back to the multi-widget array

update_option(\'widget_some-widget\', $options); // write the altered widget options back into the wp_options table*

}
*在获取或更新数组之前,添加适当的条件语句以检查选项是否存在。

**这是多窗口小部件的特殊解决方案。

就是这样!这个简单的小函数现在允许我们控制各种小部件的输出,只需通过编程方式更改它们的选项,而不是手动或黑客攻击代码。例如,我现在在博客的Frontpage上有一个第三方小部件,它通常显示admin中设置的固定类别中的帖子列表,但现在它的类别(及其标题)会根据函数中放置的自定义函数定期更改。php。可能的应用程序是无穷无尽的,它解决了与缺少有用挂钩的插件交互的许多问题,所有这些都不需要入侵插件的代码。在混音中添加自定义字段,我们就可以飞行了。。。

SO网友:MikeSchinkel

你好@maduroblanco:

这很可能是一次黑客攻击,但你是否尝试过\'option_widget_some-widget\' 像这样?

add_filter(\'option_widget_some-widget\',\'your_option_widget_some_widget\');
function your_option_widget_some_widget($value) {
  static $instance = 1;
  select ($instance) {
    case 1: 
      $value = \'foo\'; // Return whatever your first one needs
      break;
    case 2: 
      $value = \'bar\'; // Return whatever your second one needs 
      break;
    case 3: 
      $value = \'baz\';  // Return whatever your third time needs
      break;
  }
  $instance++;
  return $value;
}  
再说一次,这是一个很大的黑客,但它可能会工作?我还没有测试过这段代码,所以如果它提供了您想要的东西,请告诉我。请注意,过滤器名称基于选项的名称,因此请确保更改该名称以匹配任何选项名称。

结束

相关推荐

How do you debug plugins?

我对插件创作还很陌生,调试也很困难。我用了很多echo,它又脏又丑。我确信有更好的方法可以做到这一点,也许是一个带有调试器的IDE,我可以在其中运行整个站点,包括插件?