是否可以设置一个“虚拟”页面 – 只是出现在页面列表中的页面标题,以及一个不可编辑且没有 slug 的页面?
这更像是一个假设性的问题,因为我不知道从哪里开始编写代码或确定最佳方法。
我希望可以选择在页面列表中设置这样的父/子层次结构,以便子页面属于父页面,但父页面只是一个占位符而不是真实页面。
原因:对于没有很多 WordPress 经验的用户,在父/子层次结构中组织页面很有帮助 – 特别是如果有很多页面 – 这样相关页面在页面列表中更有条理。 如果子页面在父页面下组织,用户也可以可视化构建菜单。 问题是父页面是可编辑的,而不是已建立页面内容的一部分,根据我的经验,这会导致用户混淆。
我可以使用一个函数来删除特定页面的编辑器,并在 robots.txt 中使用 entires 来不索引虚拟父级,但这意味着为新父级更改那些。 那个父页面仍然有一个 slug,即使被阻止了
那么有没有一种方法可以创建一个函数来创建页面标题并能够分配子页面,但父页面不可打开、不可编辑且没有 slug?
好的,这是我的尝试,它很老套,最后我无法删除父项的链接/颜色,但是父链接将不起作用..所以它有点用。
首先创建一个具有以下参数集的 CPT:
$args = array(
'hierarchical' => true,
'public' => false,
'show_ui' => true,
'show_in_menu' => true,
'capability_type' => 'post',
'supports' => array( 'title','page-attributes' ),
);
根据需要填写其余部分,这将使您能够拥有一个显示在管理员中但不显示在前端的父帖子/页面,它还允许父功能通过 page-attributes
.
现在我们可以加入一个过滤器来去除小的 “编辑”、“查看”和“垃圾” 父母的链接。
function wpse_95518($actions) {
global $post;
//rename this to your CPT
if ($post->post_type =="parent"){
// check if it's a parent
if ( ! (is_post_type_hierarchical('parent') && $post->post_parent )) {
unset( $actions['inline hide-if-no-js']);
unset( $actions['trash'] );
unset( $actions['view'] );
unset( $actions['edit'] );
}
return $actions;
}
return $actions;
}
add_filter('page_row_actions', 'wpse_95518');
现在事情变得有点奇怪,删除父标题链接功能来编辑帖子。
function wpse_removetitle_95518($action){
global $post;
if ($post->post_type =="parent"){
if ( is_post_type_hierarchical('parent') && $post->post_parent ) {
return $action;
}else{
return '#'; //just in case
}
}
return $action;
}
add_filter( 'get_edit_post_link', 'wpse_removetitle_95518');
现在 CPT 的父项目不应该通过管理中的链接进行编辑,它将显示为 edit.php?post_type=parent#
但孩子们会没事的。
缺点是父项目仍然是蓝色链接而不是黑色文本,我找不到任何简单的方法来从标题中删除链接或添加自定义 CSS 来通过 javascript 来完成它而不扩展 WP List Table
.
您当然可以使用更改父标题 the_title
过滤器,但甚至将其设置为 NULL
通过上面的条件仍然显示一个 < a href=..>
也可能有一种更简单的方法来完成所有这一切,只需使用 is_post_type_hierarchical
筛选。
Github 链接到标题的表类代码。
