我想你现在还没有找到答案,但我确实找到了答案。我把它贴在这里,因为这在搜索结果中出现得很高。
我所做的是过滤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标记的方式,那么它也需要在此处更新。我认为这些都是获得我想要的解决方案的合理权衡。