我有一些自动生成的页面。然后,我使用自定义设置框允许用户交换这些页面上的内容。
问题是,我不希望用户能够删除这些特定页面。其中一页是“免责声明”。我这样做的原因是因为我正在创建一个多站点的法律博客网络,根据美国法律,每个页面都必须有免责声明。
如何从仪表板隐藏这些自动生成的页面(如下面的“免责声明”)by title, 而不是ID?
// If there is no disclaimer page, generate one from its template
$page = get_page_by_title( \'Disclaimer\' );
if(!$page)
{
wp_insert_post(array(
\'post_name\' => \'disclaimer\',
\'post_title\' => \'Disclaimer\',
\'post_status\' => \'publish\',
\'post_type\' => \'page\',
\'post_author\' => 1,
\'page_template\' => \'page-disclaimer.php\',
));
}
最合适的回答,由SO网友:gmazzap 整理而成
您可以使用上的筛选器隐藏页面pre_get_posts
. 这可以通过设置完成\'post__not_in\'
参数,但该参数需要页面ID。和you don\'t know the id before the page is created.
因此,tou可以运行额外的查询来根据标题检索ID,或者更好地根据slug(即“post\\u name”)检索ID。
add_action(\'pre_get_posts\', \'hide_some_pages\');
function hide_some_pages( $query ) {
if ( ! is_admin() ) return;
$screen = get_current_screen();
if ( $query->is_main_query() && $screen->id === \'edit-page\' ) {
// add the post_name of the pages you want to hide
$hide = array(\'disclaimer\', \'hiddenpage\');
global $wpdb;
$q = "SELECT ID FROM $wpdb->posts WHERE post_type = \'page\' AND post_name IN (";
foreach ( $hide as $page ) {
$q .= $wpdb->prepare(\'%s,\', $page);
}
$tohide = $wpdb->get_col( rtrim($q, \',\') . ")" );
if ( ! empty($tohide) ) $query->set(\'post__not_in\', $tohide);
}
}
SO网友:Borek
如果要对仪表板中的用户隐藏这一页,可以尝试使用以下内容:
function hide_disclaimer($query) {
if ( ! is_admin() )
return $query;
global $pagenow, $post_type;
if ( !current_user_can( \'administrator\' ) && is_admin() && $pagenow == \'edit.php\' && $post_type == \'page\' )
$query->query_vars[\'post__not_in\'] = array( \'1\' ); // Enter your page ID(s) here
}
add_filter( \'parse_query\', \'hide_disclaimer\' );
当然,您必须确定页面ID并将其添加到数组中。使用此代码,您可以向要隐藏的数组添加更多页面。