我需要一种方法来过滤在编辑页面上的页面父级下拉列表中的标题

时间:2019-03-12 作者:Dane Morgan

我们将自定义面包屑标题用于分层自定义帖子类型。我们希望页面父下拉列表使用面包屑标题(如果可用),然后使用标题(如果不可用)。

1 个回复
SO网友:rtpHarry

我想你现在还没有找到答案,但我确实找到了答案。我把它贴在这里,因为这在搜索结果中出现得很高。

我所做的是过滤WordPress的下拉框生成器。

它传入一个参数数组。一个是id select元素的,对于页面的该部分parent_id, 它也会通过post_type 因此,我将其限制为我想要修改的帖子类型。

然后,技术是修改WP_Query 具有新标题的对象。

不幸的是,在调用此过滤器时,会为选择框生成完整的html标记,所以我所做的只是从WordPress核心中提取html片段并将其放入我的过滤器中。这样它就可以用我修改过的WP_Query 对象。

function customise_parent_page_dropdown($output, $parsed_args, $pages)
{
// CUSTOMISE HERE TO FILTER TO THE POST_TYPE YOU WANT
    if("parent_id" === $parsed_args[\'id\'] && "mix-question" === $parsed_args[\'post_type\']) {
        // update the page titles
        foreach($pages as $key => $page){
// CUSTOMISE HERE TO ALTER THE TITLE HOW YOU WANT
            $previous_answer = get_field(\'previous_answer\', $pages[$key]->ID);
            if($previous_answer !== "") {
                $pages[$key]->post_title = $previous_answer . " – " . $pages[$key]->post_title;
            }
        }

        // regenerate the select tag - clone of the wordpress core code
        // https://github.com/WordPress/WordPress/blob/d5b8d282e8c03929aafb1fa660181b7db9ad55d3/wp-includes/post-template.php#L1187
        if ( ! empty( $pages ) ) {
            $class = \'\';
            if ( ! empty( $parsed_args[\'class\'] ) ) {
                $class = " class=\'" . esc_attr( $parsed_args[\'class\'] ) . "\'";
            }
    
            $output = "<select name=\'" . esc_attr( $parsed_args[\'name\'] ) . "\'" . $class . " id=\'" . esc_attr( $parsed_args[\'id\'] ) . "\'>\\n";
            if ( $parsed_args[\'show_option_no_change\'] ) {
                $output .= "\\t<option value=\\"-1\\">" . $parsed_args[\'show_option_no_change\'] . "</option>\\n";
            }
            if ( $parsed_args[\'show_option_none\'] ) {
                $output .= "\\t<option value=\\"" . esc_attr( $parsed_args[\'option_none_value\'] ) . \'">\' . $parsed_args[\'show_option_none\'] . "</option>\\n";
            }
            $output .= walk_page_dropdown_tree( $pages, $parsed_args[\'depth\'], $parsed_args );
            $output .= "</select>\\n";
        }
    }

    return $output;
}
add_filter(\'wp_dropdown_pages\', \'customise_parent_page_dropdown\', 100, 3);
在我的示例代码中,我引入了一个ACF字段,我想用它作为前缀。把这个换成你想要的。

这种方法的潜在缺陷是,如果有人使用id调用此post类型上的下拉生成器parent_id 它将匹配并过滤。

此外,如果WordPress将来更改了它生成select标记的方式,那么它也需要在此处更新。我认为这些都是获得我想要的解决方案的合理权衡。

相关推荐