恐怕这种钩子不存在。您有两个选项:
使用\'post_class\'
筛选挂钩,检查admin中是否存在,查询字符串是否包含短代码,如果存在,以及帖子是否没有添加该短代码hidden
通过core admin CSS设置为display: none
. 通过这种方式,可以检索到没有短代码的帖子,但这些帖子是隐藏的第二种解决方案是在\'posts_where\'
并使用添加SQL where子句REGEXP
MySQL function 这样就不会检索帖子了,我更喜欢第二种解决方案,在我看来,它更优雅、性能更好,但可能是核心has_shortcode
函数比简单的SQL正则表达式更可靠。
解决方案1
add_filter( \'post_class\', \'filter_posts_by_shortcode_css\', 10, 3 );
function filter_posts_by_shortcode_css( $classes, $class, $postid ) {
if ( is_admin() ) {
$screen = get_current_screen();
$sh = filter_input( INPUT_GET, \'shortcode\', FILTER_SANITIZE_STRING );
if ( ! empty( $sh ) && $screen->base === \'edit\' ) {
$post = get_post( $postid );
if( ! has_shortcode( $post->post_content, $sh ) ) {
$classes[] = \'hidden\';
}
}
}
return $classes;
}
溶液2
add_action(\'posts_where\', \'filter_posts_by_shortcode\');
function filter_posts_by_shortcode( $where ) {
if ( is_admin() ) {
$screen = get_current_screen();
$sh = filter_input( INPUT_GET, \'shortcode\', FILTER_SANITIZE_STRING );
if ( $screen->base === \'edit\' && ! empty( $sh ) && shortcode_exists( $sh ) ) {
$where .= " AND post_content REGEXP \'\\\\\\[([[:blank:]]*)$sh([^\\\\\\[]*)\\\\\\]\'";
}
}
return $where;
}
请注意,要使这两种解决方案都起作用,必须通过
add_shortcode
, 因此,如果您自己或第三方插件/主题注册了短代码,请确保它/它们/已在管理员屏幕中注册,然后再进行查询。