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


Modifying standard WordPress 4.4.2 Categories widget to display custom taxonomies

我编辑了(当然是一份副本)/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,但对我来说,最好的方法是使用原始类并进行一些修改。