访问多维数组以向默认WordPress小部件添加类时出现问题

时间:2013-01-16 作者:Alex Mangini

我一直在编写一个函数,将类分配给我选择的默认WordPress小部件。经过一系列的研究和修改,我想出了下面的函数。

快速解释其作用:

变量,$classes, 保存我要为每种类型的小部件分配的类名,以及为每个小部件分配的类(例如,我要添加.main-blocks “归档和类别”窗口小部件)。

我使用if 语句来匹配小部件类型,以确保类仅分配给我在中列出的小部件$classes. 因为每个小部件都有一个唯一的ID号,所以我添加了$widget_num 也要检查一下。例如,类别小部件的HTML可能会得到如下输出:<li id="categories-2">...</li>

The problem: 我想我没有访问array 正确地说,因为这段代码什么都不做。在使用一些之前,我有一个版本可以使用if/else 声明(只是为了让事情顺利进行),但我更关心的是效率,而不仅仅是为了工作而创造东西。

当这起作用时,小部件的HTML应该是这样的,并将类分配给我指定的小部件:

http://i.stack.imgur.com/hFPI7.png

谢谢你的帮助!

<小时>

function md_widget_classes($params) {
    global $wp_registered_widgets;
    $widget_id = $params[0][\'widget_id\'];
    $widget_obj = $wp_registered_widgets[$widget_id];
    $widget_num = $widget_obj[\'params\'][0][\'number\'];
    $classes = array(
        \'mini-blocks\' => array(\'categories\', \'archives\'),
        \'full-blocks\' => array(\'recent-comments\', \'recent-posts\'),
        \'blocks-list\' => array(\'links\', \'meta\'));

    foreach($classes as $class => $widgets)
        foreach($widgets as $widget)
            if($params[0][\'widget_id\'] == "$widget-$widget_num")
                $params[0][\'before_widget\'] = str_replace(\'class="\', $class, $params[0][\'before_widget\']);
    return $params;
}
    add_filter(\'dynamic_sidebar_params\', \'md_widget_classes\');

1 个回复
最合适的回答,由SO网友:s_ha_dum 整理而成

正如您所说,问题不在于如何访问阵列。它是与str_replace 线这会生成错误的标记。您正在替换class=" 你的课程,所以<aside id="whatever" class="abc"> 成为<aside id="whatever" full-blocks">. 这完全是错误的。尝试:

$params[0][\'before_widget\'] = preg_replace(\'/class="([^"]*)"/\', \'class="\'.$class.\'"\', $params[0][\'before_widget\']);
这将为您提供有效的标记。我担心会完全取代这些课程。我会考虑加入他们。这是一个非常简单的改变:

$params[0][\'before_widget\'] = preg_replace(\'/class="([^"]*)"/\', \'class="$1 \'.$class.\'"\', $params[0][\'before_widget\']);
请注意$1 就在class=" 在替换字符串中。

结束