3

クライアントから投稿をサムネイルで並べ替えるように依頼されたので、最初に投稿をサムネイルで並べ替え、次にサムネイルなしで並べ替える必要があります。

これが私のコードです:

$the_query = new WP_Query(array(
               'post_type' => 'veiculos',
               'posts_per_page'=> -1,
               'meta_key' => '_thumbnail_id',
               'orderby' => 'meta_value_num',
               'order' => 'DESC',
               'tax_query' => array(
                 array(
                   'taxonomy' => 'categoria-veiculo',
                   'field' => 'id',
                   'terms' => 5
                 )
               )
           ));

しかし、何が起こるかというと、メタキーを配置すると、サムネイルが表示されない投稿が表示されないということです。

4

2 に答える 2

4

これは興味深い問題です。WordPressには現在、組み込みメソッドを使用して 1 つのクエリでサムネイル付きの投稿とサムネイルなしのすべての投稿を取得する方法がありませんWP_Query。しかし、私たちはそのためのハックを行うことができます.おそらく私が思う最高のものではありませんが、うまくいくでしょう:)

この関数をテーマのfunctions.phpファイルに追加します

function remove_metakey ($where) {

    global $wpdb;

    $where = str_replace("AND (".$wpdb->postmeta.".meta_key = '_thumbnail_id' )", "", $where);

    return $where;
}

new WP_QueryObjectを呼び出す直前に、このフィルターを追加します。

add_filter ('posts_where_request', 'remove_metakey');

したがって、完全なものは次のようになります。

add_filter ('posts_where_request', 'remove_metakey');

$the_query = new WP_Query(array(
               'post_type' => 'veiculos',
               'posts_per_page'=> -1,
               'meta_key' => '_thumbnail_id',
               'orderby' => 'meta_value_num',
               'order' => 'DESC',
               'tax_query' => array(
                 array(
                   'taxonomy' => 'categoria-veiculo',
                   'field' => 'id',
                   'terms' => 5
                 )
               )
           ));

WP_QUEry オブジェクトを呼び出す前にフィルターを追加する必要があります。そうしないと機能しません。また、このフィルターを functions.php ファイルに追加しないでください。これposts_where_requestは、作成されるたびにレンダリングされるためです。

WP_Queryこれが何をするかというと、オブジェクトでクエリを実行しているときに、 posts_where_request. 独自の関数を でフックしていますposts_where_request。したがって、posts_where_requestが呼び出されると、関数がレンダリングされます。この関数ではstr_replace、値の meta_key 部分を置き換えて返すために使用し$whereています。これにより、クエリの where 部分の meta_key 条件が削除されます。

アップデート :

WordPress フックを使用して where 条件からメタ キーを削除する正しい方法を見つけました。これは、はるかに優れたクリーンな方法です。

WP_Query オブジェクトを呼び出す前に、このフックを追加してください。以前のフックの代わりにこれを使用します。

add_filter ('get_meta_sql', 'remove_metakey');

以前の関数を次のように置き換えます。

function remove_metakey ($array) {

    $array['where'] = ''; //you can also use unset, but setting the value to null is better to avoid warnings

    return $array;
}

完全なものは次のようになります。

add_filter ('get_meta_sql', 'remove_metakey');

$the_query = new WP_Query(array(
               'post_type' => 'veiculos',
               'posts_per_page'=> -1,
               'meta_key' => '_thumbnail_id',
               'orderby' => 'meta_value_num',
               'order' => 'DESC',
               'tax_query' => array(
                 array(
                   'taxonomy' => 'categoria-veiculo',
                   'field' => 'id',
                   'terms' => 5
                 )
               )
           ));

これが正しい方法です。where値をに設定してnull、SQL クエリで追加のメタ キー条件を防止します。

このフィルタは、必要な場合にのみ追加してください。また、これを functions.php に追加しないでください。そうすると、get_meta_sql 関数が呼び出されるたびに実行されます。

これがお役に立てば幸いです:)

于 2013-04-11T19:08:36.113 に答える
0

2 つのクエリを作成してみませんか。1 つ目はサムネイル付きの投稿のみを好きな順序で返し、2 つ目はサムネイルなしの投稿のみを好きな順序で返します。

つまり、最初のクエリにはサムネイル付きの投稿が含まれ、2 番目のクエリには、has_post_thumbnail関数を使用するループ内の条件付きステートメントを含むすべての投稿が含まれます。

解決しようとしている問題は、1 つのクエリで解決策を見つけるために検索に時間がかかるため、このアプローチにより時間を節約できると思います。

幸運を

于 2013-04-11T18:43:05.257 に答える