我开发了我的第一个插件,通过这种方法来程序化地创建一些页面。
$page_id = wp_insert_post(
array(
'comment_status' => 'close',
'ping_status' => 'close',
'post_author' => 1,
'post_title' => 'HSN Form',
'post_name' => strtolower(str_replace(' ', '-', trim('hsn-form'))),
'post_status' => 'publish',
'post_type' => 'page',
)
);
我为它设置了模板文件。
add_filter( 'page_template', 'hsn_service_form_page_template', 10, 1 );
function hsn_service_form_page_template( $page_template ){
if ( is_page( 'hsn-form' ) ) {
$page_template = plugin_dir_path(__DIR__) . 'service-form/form-template.php';
}
return $page_template;
}
之后我想把它从wordpress的仪表盘中完全隐藏起来, 但这些必须通过以下方式来实现:
wwww.example.comhsn-form。
我可以从页面菜单中按以下代码隐藏它。
add_filter( 'parse_query', 'ts_hide_pages_in_wp_admin' );
function ts_hide_pages_in_wp_admin($query) {
global $pagenow,$post_type;
$page = get_page_by_path('hsn-form');
if (is_admin() && $pagenow=='edit.php' && $post_type =='page') {
$query->query_vars['post__not_in'] = array($page->ID);
}
}
这是好的,但它仍然可以在Appereance->菜单,你可以创建导航菜单。
我找过了,但我找不到完整的解决方案。
所以,如果有人知道一个完整的解决方案,这应该是伟大的。
将parse_query改为pre_get_posts。
为了从管理员导航菜单中删除一个页面,你可以挂入 admin_menu
动作,然后操纵全局的 $submenu
变量。
add_action('admin_menu', function(){
global $submenu;
array_walk($submenu, function(&$child, $parent){
if( $parent != 'edit.php' )
return;
foreach($child as $key=>$submenu){
if( $submenu[2] == 'post-new.php' ) {
unset($child[$key]);
break;
}
}
});
});
在这个例子中,我们正在寻找一个子页面,其slug为 post-new.php
在顶层页面的下面,有一个弹头。edit.php
. 如果被发现,就会从导航菜单中完全删除。
该 $submenu[2]
部分正在寻找数组中的slug元素。如果你想通过子菜单中的 名称 取而代之,你可以用 $submenu[0]
.