web-dev-qa-db-ja.com

カスタムフィールドによるアーカイブソート機能(フロントエンド)

私は事前に定義したいくつかのカスタムフィールドでアーカイブ内の投稿をソートする機能をユーザーに提供したいと思います。

最終結果はタブ付きコンテナになり、ユーザーは自分が見たい関連フィルタリンクをクリックします。

例として: http://www.metacritic.com/browse/games/genre/date/action/all

したい:
- 日付で絞り込む
- タイトルで絞り込む
- meta_keyで絞り込む

これは可能ですか?

すべての助けをありがとう.. :)

3
Martin-Al

注:Jan Fabryの答えについて...最初に受信データをサニタイズすることを忘れないでください。さもなければあなたはあなた自身をあらゆる種類の厄介なクエリ文字列に開放しています..

Returnの代わりに、おそらくそのフィルタに入ってくるデータを返すべきです。

また、可能な値の配列を持つか、可能なメタ値を検索することをお勧めします。そうすることで、入力値がそれらの可能な値のいずれかと一致するかを確認できるスイッチを構築できます。入ってきます)。

ここには普通のユーザーではありません、そうでなければ私は例を投稿するでしょう(投稿コードがここでどのように機能するのかわかりません - FAQにそれを見つけることができませんでした)。

編集:コードを投稿するための情報を私を指しているポスターをありがとう。

例が続きます、うまくいけばうまくいきます... :)

// Only add the needed meta orders
$possible_orders = array( 'some_meta_key', 'some_other_meta_key' );

add_filter( 'pre_get_posts', 'archive_meta_sorting' );
function archive_meta_sorting( $query_object ) {
    if( !is_archive() || is_admin() )
        return $query_object;

    if( !isset( $_GET['orderby'] ) )
        return $query_object;

    global $possible_orders;

    $orderby = trim( $_GET['orderby'] );    

    switch( $orderby ) {
        case( in_array( $orderby, $possible_orders ) ):
            $query_object->set( 'orderby', 'meta_value' );
            $query_object->set( 'meta_key', $orderby );
            break;
        // You don't actually need these two cases below, it will work without them
        // The switch could actually just be a simple if in_array condition..
        case 'title':
            $query_object->set( 'orderby', 'title' );
            break;
        case 'date':
            $query_object->set( 'orderby', 'date' );
            break;
    }
    return $query_object;
}

メタソートの値を渡すだけでよく、タイトルと日付はそれらの値による順序付けのためのネイティブサポートを使用して問題なく動作します。順序についても同じことが言えます(descまたはasc)。

私はそれが役立つことを願っています...

2
t31os

これは確かに可能ですが、どれだけ簡単にできるかは、URLをどの程度クリーンにするかによって異なります。 ?orderby=[fieldname]&order=[asc or desc]を追加しても構わない場合は、試してみることができます。アーカイブページに?orderby=title&order=ascを追加すると、実際には、タイトル順に「Z」の前に「A」が付​​きます(デフォルトの順序は降順です、日付順に並んでいる場合は論理的です)。

ratingのようにメタキーで並び替えたい場合は、orderby=ratingを追加するだけでは不十分ですが、 このメタキーをクエリに含めることをWP_Query::get_posts()関数に伝えなければなりません 。これを行う最良の方法はおそらくpre_get_postsアクションにフックすることです。そこで、このorderフィールドの存在を確認し、必要に応じてそれをオブジェクトのquery_varsに追加することができます。このようなもの(しかし未テスト):

add_action('pre_get_posts', 'check_meta_sort');
function check_meta_sort(&$query)
{
    if (!isset($_GET['orderbymeta'])) {
        return;
    }
    $query->query_vars['meta_key'] = $_GET['orderbymeta'];
    $query->query_vars['orderby'] = $_GET['orderbymeta'];
}

/title/date/[meta-key]で終わる、 "素敵な" URLが欲しいなら、Rewriteエンジンを調べる必要があるでしょう、しかし私はあなたを助けることができません( yet )。

1
Jan Fabry