我编辑了(当然是一份副本)/wp-includes/widgets/class-wp-widget-categories.php,只需在$cat_args=array();的末尾添加一行(#59作为wp 4.2.2中的原始文件),就可以强制它显示我的自定义分类法的内容;,所以现在它读取
$cat_args = array(
'orderby' => 'name',
'show_count' => $c,
'hierarchical' => $h,
'taxonomy' => 'my_taxonomy'
);
在这一点上没有什么真正的困难,当新的小部件设置为列表时,一切都按预期工作。
在将新的小部件设置为显示为下拉菜单后,所有内容都会立即崩溃,因为下拉列表中的所有项目都指向不存在的URL。
正如我的经验水平(事实上它小于零。但我正在学习!)让我看到的那样,问题隐藏在原始小部件的#62行中
$dropdown_id = ( $first_dropdown ) ? 'cat' : "{$this->id_base}-dropdown-{$this->number}";
在我看来,这个确切的字符串负责根据从#82行开始的JS设置下拉列表项的值。
我可以更换
?cat=
带有
my_taxonomy/
在第88行,但我需要将正确的值放入$dropdown_id变量中。
这就是我的问题。
有人能帮忙吗?
问题非常不清楚。但是,如果您正在使用此方法访问属于类别的自定义分类法,那么它将不会显示。显示自定义分类法的过程大不相同。
由于我自己发现了解决方案,我将回答我自己的问题,以防任何人都面临同样的问题。
由于Walker_CategoryDropdown
类的古老缺陷或特性,如果不对其进行一点修改,就不可能强制wp_dropdown_categories()
使用自定义分类法。
因此,我需要修改/wp-includes/class-walker-page-dropdown.php
中的Walker_CategoryDropdown类。
为了保留原始的class-walker-page-dropdown.php,我应该将其内容复制到我的插件文件中。然后我应该更换
$args['value_field'] = 'ID';
在第48行发现
$args['value_field'] = 'slug';
使修改后的类能够获得分类法slug而不是类别ID,并将其放入我的新小部件的<option>
的value="项中。
然后我删除了第1行、第47行和第49行,并替换了
class Walker_PageDropdown extends Walker {
带有
class custom_walker_dropdown extends Walker_CategoryDropdown {
将此修改定义为一个新的独立类。
最后,我在基于WP的原生Categories小部件的新小部件中将新类设置为wp_dropdown_categories()
的Walker。
我避免将新的类小部件设置为宽的,因为这会破坏新小部件的List部分,所以custom_walker_dropdown
类应该仅为wp_dropdown_categories()
设置为walker。
最后一步是替换我修改的/wp-includes/widgets/class-wp-widget-categories.php
副本的第87行
if ( dropdown.options[ dropdown.selectedIndex ].value > 0 ) {
带有
if ( dropdown.options[ dropdown.selectedIndex ].value !== 0 ) {
以使负责此下拉菜单的JS工作。
宾果!一切正常。
事实上,在谷歌上到处都可以找到很多定制的Walker,但对我来说,最好的方法是使用原始类并进行一些修改。