web-dev-qa-db-ja.com

ホームページのカスタム投稿注文

ホームページに[最も人気のある、最新の、トレンド]を含むドロップダウンを表示したいと思います。ユーザーがそれらのうちの1つを選択すると、投稿はページのリロードで、投稿はその順序でソートされます。

今のところ、ソート順の検出にクエリ文字列を使用しています。例えば、http://example.com/?sort=popularまたはhttp://example.com/?sort=trendingです。それからhome.phpでクエリ文字列をチェックし、wp_queryオブジェクトのorderby節を編集します。

これが正しいアプローチであるかどうか、またはこのケースを処理するためのより良い方法はありますか?ページネーションなどの処理も​​したいからです。

Home.phpに

/**
 * check query for most popular.
 */
function check_for_popular() {
    return get_query_var('sort') == "popular";
}
function mp_home_loop() {
global $wp_query;
    if( check_for_popular() ) {
        $query = $wp_query->query_vars;
        $wp_query = new WP_Query( wp_parse_args( array(
            'meta_key' => 'popularity_score',
            'orderby'  => 'meta_value_num',
            'order'    => 'DESC',
            ), $query ) );
    }
    include( CHILD_DIR . '/mp_home_loop.php' );
} 

Functions.php内

add_filter('query_vars', 'add_query_vars' );
function add_query_vars( $qvars ) {
   $qvars[] = 'sort';
   return $qvars;
}
2
Ahmed

命名の観点からすると、最初に条件でフィルタリングし、次に注文時にソート(方向)が適用されるため、「フィルター」という用語の方が適切であると思われます。しかし、それは命名規則の観点からです。

コード構造から、いくつかの場所でcheck_for_popular()メソッドを使用しているなら、それはあなたがしたようにそれを構造化することは意味があります。これが関数のフィルタリングのみを目的としている場合は、WP_Queryの引数にswitchステートメントを使用してからクエリを実行します。これらの線に沿って何か:

function mp_home_loop() {
    global $wp_query;
    $filter_args = array();
    switch( get_query_var('sort') ){
        case 'popular':
            $filter_args = array(
                'meta_key' => 'popularity_score',
                'orderby'  => 'meta_value_num',
                'order'    => 'DESC'
                );
        break;
        case 'trending':
            // obviously assign your own query args
            $filter_args = array(
                'meta_key' => 'trending_score',
                'orderby'  => 'meta_value_num',
                'order'    => 'DESC'
                );
        break;
    }
    $wp_query = new WP_Query( wp_parse_args( $filter_args, $wp_query->query_vars ) );
    include( CHILD_DIR . '/mp_home_loop.php' );
} 

このクエリがどのように使用されているかに応じて(メインクエリを駆動しているかのように)、これをさらにpre_get_postsフックに移行することをお勧めします。しかし、あなたはそれがホームページのためであると述べたので、私はあなたがこれをページの特定のサブセクションを持っていると思います。

1
codearachnid