web-dev-qa-db-ja.com

ショートコードのある投稿のみを表示するバックエンド投稿リストをフィルタリングする方法

管理パネルの投稿とページのテーブルを特定のショートコードでフィルタリングする必要があります。私のプラグインでは、 "投稿"と "ページ"ビューにショートコード用の列を追加し、それぞれの投稿で使用されているショートコードの一覧を表示しています。今、私は列内のショートコードの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
    }

}

[管理]パネルの[すべての投稿/ページを表示]テーブルの各行に対して起動するフックはありますか。それとも私がこれに結びつけることができる別のフィルタがありますか?

1
Matt

フックの種類が存在しないことを知っています。次の2つの選択肢があります。

  1. 'post_class'フィルターフックを使用し、adminでクエリ文字列にショートコードが含まれているかどうかを確認し、含まれている場合、投稿にそのショートコードがない場合、コア管理CSSを介してdisplay: noneに設定されるhiddenクラスを追加します。このようにして、ショートコードのない投稿は取得されますが、非表示になります。
  2. 2番目の解決策は、'posts_where'でフィルターを使用し、 REGEXP MySQL function を使用してSQL where句を追加することです。この方法で投稿は取得されません。

私はよりエレガントでパフォーマンスの良い2番目のソリューションを好みますが、コア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を介してショートコードを登録する必要があるため、ショートコードが自分またはサードパーティのプラグイン/テーマによって登録されている場合は、管理画面で、クエリが実行される前に登録されています。

0
gmazzap

このフィルタを使用して新しい列を追加し( 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)でそれを検索することができますあなたのショートコード.

0
Jonathan