web-dev-qa-db-ja.com

WP_Queryのパラメータを$ wpdbに複製する

この基本的な質問をしてください:

$posts = new WP_Query(array(
    'post_type' => 'page'
    's' => 'some search query'
));

WordPressはsome search queryを3つの別々の検索語に分割します、それで私はこの$ wpdb関数を作る必要があります。私は同じ機能が欲しいのですが、クエリ全体を1つの検索語として扱います。

これが私がいるところです。

global $wpdb;
$post_type = 'product';

$db_matches = $wpdb->get_results("
                                    SELECT ID
                                    FROM $wpdb->posts
                                    INNER JOIN $wpdb->term_relationships ON $wpdb->term_relationships.object_id = $wpdb->posts.post_title
                                    WHERE post_title LIKE '%$query%'
                                        AND post_type = '$post_type'
                                        AND post_status = 'publish'
                                    ");

これは私にとって初めての内部結合なので、おそらく間違いです。このクエリを修正するには、2つのことを行う必要があります。

  1. 内部結合行の構文を修正してください。
  2. WHERE句に言語フィルタを追加します(AND term_taxonomy_id = 2のようなものにするべきですよね?)。私はPolylangを使用しているので、object_idterm_relationshipsテーブルに存在し、値2を持つことを確認する必要があります。

それで、だれでも私にこれで手を貸すことができますか?どうもありがとう。

1
Brian
  1. あなたはあなたのINNER JOINにあなたが参加しているようです

    wp_term_relationships.object_id == wp_posts.post_title
    

    この場合、object_idがpost-idであるため、これは誤りです。

    すべてのIDが必要です(ポストID)

    SELECT ID FROM $wpdb->posts
    

    wp_term_relationshipsテーブルにレコードがある人

    // Now we are comparing the correct columns
    INNER JOIN $wpdb->term_relationships ON $wpdb->term_relationships.object_id = $wpdb->posts.ID 
    
  2. 追加のwhere句を追加する

    term_taxonomy_idが2に等しい場合

    WHERE $wpdb->term_relationships.term_taxonomy_id = 2
    
2
trevbro

WordPressはいくつかの検索クエリを3つの別々の検索語に分割します。そのため、この$ wpdb関数を作成する必要があります。私は同じ機能が欲しいのですが、クエリ全体を1つの検索語として扱います。

WP_Queryにはsentenceおよびexact入力検索パラメーターがあります。

手動で検索クエリを手動で作成するのではなく、.

$query = new WP_Query( [
    'post_type' => 'page',
    's'         => 'some search query',
    'sentence'  => true,
    'exact'     => true,
] );

生成されたSQLクエリには、次のものが含まれます。

(wp_posts.post_title LIKE 'some search query') OR 
(wp_posts.post_excerpt LIKE 'some search query') OR 
(wp_posts.post_content LIKE 'some search query')

exactfalseとすると、次のようになります。

(wp_posts.post_title LIKE '%some search query%') OR 
(wp_posts.post_excerpt LIKE '%some search query%') OR 
(wp_posts.post_content LIKE '%some search query%')

それが役に立てば幸い!

1
birgire