我一直在编写一个函数,将类分配给我选择的默认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\');
最合适的回答,由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="
在替换字符串中。