如何处理小部件中的内容?

时间:2011-10-18 作者:JVC

Possible Duplicate:
Is There A Hook To Process The Content Of The Text Widget?

我创建了一个插件,它在正文内容中使用标记来动态插入某些内容。例如:

%%关键字%%

在页面请求时,将用传入URL中指定的关键字替换。

我希望能够在一个小部件中使用这些令牌,并对它们进行相同的处理,但我的插件只知道the_content 在最终页面呈现之前,我还没有弄清楚如何告诉它解析小部件的内容。

如何做到这一点?我认为使用短代码可以更容易地完成,但我希望与我的令牌使用保持一致。

感谢您的建议!

编辑:

发帖几分钟后,我发现这篇帖子满足了我的需求:

Is There A Hook To Process The Content Of The Text Widget?

无论如何,谢谢大家!

2 个回复
SO网友:EAMann

你要找的过滤器是widget_text. 从Codex:

widget_text
应用于WordPress文本小部件的小部件文本。也可能适用于某些第三方小部件。

SO网友:EarnestoDev

下面的代码将允许您在所有小部件中,在其$实例数组中存在的所有字符串上进行替换。

// Hook into \'widget_display_callback\' filter
// It allows altering a Widget properties right before it outputs in sidebar
add_filter(\'widget_display_callback\', function($instance, $widget, $args){
    // Recursive functions that applies replacements in all string elements of $instance
    $fnFixArray = function($v) use (&$fnFixArray){
        // Dig deeper if this is an array or object
        if(is_array($v) or is_object($v)){
            // Use pointer here for property to satisfy both array/object in one
            // Otherwise for arrays we need $v[$k1] and $v->{$k1} for objects
            foreach($v as $k1=>&$v1){
                // Go recursive on elements / properties
                $v1 = $fnFixArray(v1);
            }
            return $v;
        }
        // Don\'t alter non-strings or empty ones
        if(!is_string($v) or empty($v)) return $v;
        // We found a string, replace stuff in it and return the altered value
        return str_replace(\'%REPLACEWHAT%\', \'%REPLACEWITH%\', $v);
    };
    return $fnFixArray($instance);
}, 11, 3); // We need 3 arguments and a below normal priority

It\'s a bit more advanced but it\'s WHAT you really need.

同样的事情array_walk_recursive() 它还递归对象:

// Hook into the \'widget_display_callback\' filter
// It allows altering a Widget properties right before output in sidebar
add_filter(\'widget_display_callback\', function($instance, $widget, $args){
    // This digs through arrays and objects all the way to non-iterative level
    array_walk_recursive($instance, function(&$value, $key){
        // Don\'t alter non-strings or empty ones
        if(!is_string($value) or empty($value)) return;
        // We found a string, replace stuff in it and return the altered value
        $value = str_replace(\'%REPLACEWHAT%\', \'%REPLACEWITH%\', $value);
    });
    // Return the possible altered $instance array
    return $instance;
}, 11, 3);
祝你玩得开心

结束

相关推荐

Why use widgets?

我对使用WordPress很陌生,我想知道使用小部件的好处是什么?看here 这听起来像是为那些不是程序员的人准备的,他们想在他们的网站上添加插件。对吗?或者小部件是否在某种程度上使站点更加健壮?