管理パネルの投稿とページのテーブルを特定のショートコードでフィルタリングする必要があります。私のプラグインでは、 "投稿"と "ページ"ビューにショートコード用の列を追加し、それぞれの投稿で使用されているショートコードの一覧を表示しています。今、私は列内のショートコードの1つをクリックして、そのショートコードを使用するものだけに投稿またはページのリストをフィルター処理させることができるようにしたいです。
私のカスタムコラムでは、私はこれを出力しています:<a href="?shortcode=my-shortcode-1">[my-shortcode-1]</a>, <a href="?shortcode=my-shortcode-2">[my-shortcode-2]</a>, ...
?shortcode=...
が機能するようなフィルタが必要です。これは基本的に私が念頭に置いていることですが、私はこれを達成するために私がどんなフックを使うことができるかを知る必要があります:
add_filter( 'manage_posts_row', 'filter_by_shortcode' ); // I made up this filter
function filter_by_shortcode(){
global $post; // Get the current post
if(!empty($_GET['shortcode']){ // Check for ?shortcode=...
// Check if given shortcode is used in the post
if( has_shortcode( $post->post_content, $_GET['shortcode'] )
return $post; // Return post if shortcode is found
// Return nothing if shortcode is not used
}else{
return $post; // Return post if ?shortcode=... argument is not used
}
}
[管理]パネルの[すべての投稿/ページを表示]テーブルの各行に対して起動するフックはありますか。それとも私がこれに結びつけることができる別のフィルタがありますか?
フックの種類が存在しないことを知っています。次の2つの選択肢があります。
'post_class'
フィルターフックを使用し、adminでクエリ文字列にショートコードが含まれているかどうかを確認し、含まれている場合、投稿にそのショートコードがない場合、コア管理CSSを介してdisplay: none
に設定されるhidden
クラスを追加します。このようにして、ショートコードのない投稿は取得されますが、非表示になります。'posts_where'
でフィルターを使用し、 REGEXP
MySQL function を使用してSQL where句を追加することです。この方法で投稿は取得されません。私はよりエレガントでパフォーマンスの良い2番目のソリューションを好みますが、コアhas_shortcode
関数は単純なSQL正規表現よりも信頼性が高いかもしれません。
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;
}
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
を介してショートコードを登録する必要があるため、ショートコードが自分またはサードパーティのプラグイン/テーマによって登録されている場合は、管理画面で、クエリが実行される前に登録されています。
このフィルタを使用して新しい列を追加し( http://codex.wordpress.org/Plugin_API/Filter_Reference/manage_posts_columns )、次にこのフィルタを使用してコンテンツを追加します。それに( http://codex.wordpress.org/Plugin_API/Action_Reference/manage_posts_custom_column )そしてget_post($ post_id)でそれを検索することができますあなたのショートコード.