WordPressカスタム投稿タイプの管理領域をカスタムフィールドで並べ替える方法


52

カスタム投稿タイプの1つを編集するとき、公開日ではなくカスタムフィールドごとにすべてのエントリを一覧表示できるようにします(カスタム投稿タイプの場合はおそらく関係ありません)。カスタム投稿の種類に関するブログ投稿のコメントからリードを得ました。著者は、それが可能であり、カスタム並べ替えの列名をクリックできるように作成したと述べました。彼posts_orderbyは私が自分のコメントで指摘した機能について言及しましたが、今ではブログの投稿を見つけることができます。助言がありますか?私は使用した1つのソリューションを見ました

add_action('wp', 'check_page');

また、このcheck_page関数add_filterはクエリを変更するために使用されていましたが、管理領域ではなくテーマファイルでのみ機能するはずです。


1
ここで別の便利な答え、.... <br/> wordpress.stackexchange.com/questions/66455/…で
T.Todua

回答:


66

おそらく答えが提供されていないことから想像できるように、解決策は決して簡単ではありません。私がやったことは、「movie」のカスタム投稿タイプと「ジャンル」のカスタムフィールドキーを想定した、自己完結型の例を作成することです。

免責事項:これはWP3.0で動作しますが、以前のバージョンで動作するかどうかはわかりません。

基本的に、2つのフックをフックして動作させる必要があり、別の2つのフックを使用して明確かつ有用にする必要があります。

最初のフックは ' restrict_manage_posts'で、これにより<select>、「一括アクション」および「日付の表示」がフィルターされる投稿のリストの上の領域でHTMLを送信できます。提供されたコードは、次の画面スニペットに見られるように、「並べ替え:」機能を生成します。

WordPress Adminでカスタム投稿タイプの並べ替え機能を作成する方法
(ソース:mikeschinkel.com

投稿タイプのすべてのmeta_keysのリストを提供するWordPress API関数がないため、コードはダイレクトSQLを使用しています(将来のtracチケットのように聞こえます...)とにかく、ここにコードがあります。投稿タイプ$_GETを取得して検証し、有効な投稿タイプpost_type_exists()であると同時に投稿タイプであることを確認することに注意してくださいmovie(2つのチェックはやり過ぎですが、ハードにしたくない場合の方法を示すために行いました。投稿タイプをコーディングします。)最後にsortby、WordPressの他のものと競合しないため、URLパラメーターを使用します。

add_action('restrict_manage_posts','restrict_manage_movie_sort_by_genre');
function restrict_manage_movie_sort_by_genre() {
    if (isset($_GET['post_type'])) {
        $post_type = $_GET['post_type'];
        if (post_type_exists($post_type) && $post_type=='movie') {
            global $wpdb;
            $sql=<<<SQL
SELECT pm.meta_key FROM {$wpdb->postmeta} pm
INNER JOIN {$wpdb->posts} p ON p.ID=pm.post_id
WHERE p.post_type='movie' AND pm.meta_key='Genre'
GROUP BY pm.meta_key
ORDER BY pm.meta_key
SQL;
            $results = $wpdb->get_results($sql);
            $html = array();
            $html[] = "<select id=\"sortby\" name=\"sortby\">";
            $html[] = "<option value=\"None\">No Sort</option>";
            $this_sort = $_GET['sortby'];
            foreach($results as $meta_key) {
                $default = ($this_sort==$meta_key->meta_key ? ' selected="selected"' : '');
                $value = esc_attr($meta_key->meta_key);
                $html[] = "<option value=\"{$meta_key->meta_key}\"$default>{$value}</option>";
            }
            $html[] = "</select>";
            echo "Sort by: " . implode("\n",$html);
        }
    }
}

2番目に必要な手順はparse_query、WordPressが実行するクエリを決定した後、クエリを実行する前に呼び出されるフックを使用することです。ここで、のパラメータのCodex記載されているクエリの配列の値orderbymeta_keyクエリのquery_var配列に値を設定します。次のことを確認するためにテストします。orderbyquery_posts()

  1. 私たちは管理者です(is_admin())、
  2. 管理者($pagenow=='edit.php')の投稿をリストするページにあります。
  3. ページは、とpost_type等しいURLパラメーターで呼び出されました。movie
  4. また、ページはsortbyURLパラメーターを使用して呼び出され、' None 'の値が渡されなかった

これらすべてのテストに合格した場合、私たちはその後、設定query_vars(文書化されているように、ここに)meta_valueと私たちsortby「の値ジャンル」:

add_filter( 'parse_query', 'sort_movie_by_meta_value' );
function sort_movie_by_meta_value($query) {
    global $pagenow;
    if (is_admin() && $pagenow=='edit.php' &&
        isset($_GET['post_type']) && $_GET['post_type']=='movie' && 
        isset($_GET['sortby'])  && $_GET['sortby'] !='None')  {
        $query->query_vars['orderby'] = 'meta_value';
        $query->query_vars['meta_key'] = $_GET['sortby'];
    }
}

そして、あなたがする必要があるのはそれだけです。「posts_order」または「wp」フックは不要です!もちろん、実際にはもっとする必要があります。投稿を一覧表示するいくつかの列をページに追加する必要があります。そうすると、並べ替えられている値を実際に表示できます。そうしないと、ユーザーは混乱します。manage_{$post_type}_posts_columnsこの場合、フックを追加しmanage_movie_posts_columnsます。このフックには、列のデフォルト配列が渡されます。簡単にするために、2つの標準列に置き換えました。チェックボックス(cb)および投稿名(title)。(デフォルトで利用可能な他のものを確認するためposts_columnsにaで検査print_r()できます。)

URLパラメーターがある場合とない場合に、「並べ替え基準:」を追加することにしました。sortbyNone

add_action('manage_movie_posts_columns', 'manage_movie_posts_columns');
function manage_movie_posts_columns($posts_columns) {
    $posts_columns = array(
        'cb' => $posts_columns['cb'],
        'title' => 'Movie Name',
        );
    if (isset($_GET['sortby']) && $_GET['sortby'] !='None') 
        $posts_columns['meta_value'] = 'Sorted By';

    return $posts_columns;
}

最後に、manage_pages_custom_columnフックを使用して、適切な投稿タイプの投稿があり、おそらく冗長なis_admin()andのテストがある場合に、値を実際に表示します$pagenow=='edit.php'sortbyURLパラメーターがある場合、リストで表示することで並べ替えられているカスタムフィールド値を抽出します。外観は次のとおりです(これはテストデータなので、映画の分類に関するピーナッツギャラリーからのコメントはありません!:):

WordPress管理画面でカスタム投稿タイプに追加されたカスタム列
(ソース:mikeschinkel.com

そして、ここにコードがあります:

add_action('manage_pages_custom_column', 'manage_movie_pages_custom_column',10,2);
function manage_movie_pages_custom_column($column_name,$post_id) {
    global $pagenow;
    $post = get_post($post_id);
    if ($post->post_type=='movie' && is_admin() && $pagenow=='edit.php')  {
        switch ($column_name) {
            case 'meta_value':
                if (isset($_GET['sortby']) && $_GET['sortby'] !='None') {
                    echo get_post_meta($post_id,$_GET['sortby'],true);
                }
                break;
        }
    }
}

これは、aの最初の「ジャンルmovie、つまり特定のキーに複数の値がある場合の最初のmeta_value のみを選択することに注意してください。しかし、それ以外の場合は、それがどのように機能するのかわかりません!

そして、このコードを置く場所に慣れていない人のために、あなたはそれをプラグインに置くことができfunctions.phpます。

これがどのように役立つか。


2
+1、努力のためだけ。しかし、それはさらに良くなり、円が手描きした場合 :-)
ヤンファブリ

SHOW ALL DATESフィルターを完全に削除して、特定の投稿タイプに対してカスタムフィルターのみが表示されるようにする方法はありますか?
RailsTweeter

@RailsTweeterここで示した手法を使用して、HTML生成を囲む2つのフックとが'months_dropdown_results'あり'restrict_manage_posts'ます。PS Upvotesは常に高く評価されています。:)
MikeSchinkel

@MikeSchinkel、WP APIがあるので、これでコードがいくらか更新されますか?
samjco

@samjcoわかりません。残念ながら、現時点ではこれを修正する時間はありません。
MikeSchinkel

8

WordPress 3.1(私はベータ版を使用しています)の時点で、列はタイトルでソートできるようになりました。

次の投稿では、それらの実装方法について詳しく説明します。

http://scribu.net/wordpress/custom-sortable-columns.html


-1

簡単な解決策は次のとおりです。

/* --------Sortable Events on Dashboard - show start date, time, venue--------- */

/*-------------------------------------------------------------------------------
    Custom Columns
-------------------------------------------------------------------------------*/

function my_*YOUR POST TYPE*_columns($columns)
{
    $columns = array(
        'cb'        => '<input type="checkbox" />',
        'title'     => 'Title',
        'your_custom_field'     => 'Custom Field Name',          
        'date'      =>  'Date',
    );
    return $columns;
}

function my_custom_columns($column)
{
    global $post;
    if($column == 'your_custom_field')
    {
        if(get_post_meta($post->ID, 'your_custom_field', true);)
        {
            echo get_post_meta($post->ID, 'your_custom_field', true);
        }
    }

}

add_action("manage_posts_custom_column", "my_custom_columns");
add_filter("manage_edit-*YOUR POST TYPE*_columns", "my_events_columns");

/*-------------------------------------------------------------------------------
    Sortable Columns
-------------------------------------------------------------------------------*/

function my_column_register_sortable( $columns )
{
    $columns['your_custom_field'] = 'your_custom_field';
    return $columns;
}

add_filter("manage_edit-*YOUR POST TYPE*_sortable_columns", "my_column_register_sortable" );

投稿タイプ「your_custom_field」を置き換えるだけです

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.