修改标准 WordPress 4.4.2 类别小部件以显示自定义分类法

Modifying standard WordPress 4.4.2 Categories widget to display custom taxonomies

我已经编辑(当然是副本)/wp-includes/widgets/class-wp-widget-categories.php 以强制它通过仅添加一行(#59 与原始文件一样)来显示我的自定义分类法的内容来自 WP 4.2.2) 在 $cat_args = array(); 的末尾,所以现在它显示为

$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 变量中。

这就是我的问题。

有人可以帮忙吗?

问题很不明确。但是,如果您使用此方法访问作为类别的自定义分类法,则它将不会显示。显示自定义分类的过程有很大不同。

因为我自己找到了解决方案,所以我会自己回答我的问题,以防万一有人遇到同样的问题。

不可能强制wp_dropdown_categories()使用自定义分类而不对Walker_CategoryDropdownclass做一点修改,由于到其古老的错误或功能。

所以我需要修改在/wp-includes/class-walker-page-dropdown.php中找到的Walker_CategoryDropdown class。

为了保留原始 class-walker-page-dropdown.php 我应该将其内容复制到我的插件文件中。那我应该替换

$args['value_field'] = 'ID';

在第 48 行找到

$args['value_field'] = 'slug';

使修改后的 class 能够获取分类 slug 而不是类别 ID,并将其放入我的新小部件的 <option> 的 value=" " 项中。

然后我删除了第 1、47 和 49 行并替换了

class Walker_PageDropdown extends Walker {

class custom_walker_dropdown extends Walker_CategoryDropdown {

将此修改定义为新的单独 class。

最后,我在基于 WP 的原生类别小部件的新小部件中将新 class 设置为 wp_dropdown_categories() 的 Walker。

我避免设置新的 class 小部件范围,因为它会破坏新小部件的列表部分,因此 custom_walker_dropdown class 应该设置为 walker 只有wp_dropdown_categories().

最后一步是替换我修改后的 /wp-includes/widgets/class-wp-widget-categories.php

副本的第 87 行
if ( dropdown.options[ dropdown.selectedIndex ].value > 0 ) {

if ( dropdown.options[ dropdown.selectedIndex ].value !== 0 ) {

使负责此下拉菜单工作的 JS。

宾果!一切正常。

实际上,通过谷歌搜索在这里和那里找到了大量自定义助行器,但对我而言,最好的方法是采用原始 class 并进行一些修改。