web-dev-qa-db-ja.com

$ wpdbを使用して現在のpost_idを含むメタ値を持つ投稿をクエリする

Wp_postmetaテーブルのmeta_valueに現在のpost_IDが反転カンマで含まれているデータベースから投稿のリストを取得するために$ wpdbを使用しようとしています。例えば。 "10"

逆カンマは、10が100にも一致しないようにするためなどです。

A:1:{i:0; s:2: "10";}というメタ値を正確に貼り付けると、動作するようになりますが、最新のものだけでなく、すべてのリビジョンも返されます。役職。

これが私が現在使っているコードです:

 $ id = get_the_ID(); 
 $ rows = $ wpdb-> get_results($ wpdb-> prepare(
 "
 SELECT * 
 wp_postmeta 
どこからmeta_keyと同じように%s 
 AND meta_value =%s 
 "、
 'role _%_ production'、
 '%"'。 $ id。 '"%' 
)); 
 
 //結果をループ処理します
 if($ rows){
 ... ... 
} 

任意のアイデアは大歓迎です。

ありがとう

2
Matt Edwards

あなたが投稿したコードでは、あなたが言うように「投稿のリスト」を取得するのではなく、メタテーブルの行のリストを取得します。あなたが本当に投稿のリストを取得したい場合はWP_Queryパラメータを使用してmeta_queryに頼ってください。

何かのようなもの:

$id = '10'; // unserialized value

$args = array(
  'post_type' => 'post',
  'post_status' => 'publish',
  'posts_per_page' => -1,
  'meta_query' => array(
    array(
      'key' => 'roles_%_production',
      'value' => $id,
      'compare' => 'LIKE'
    )
  )
);
$query = new WP_Query( $args );
$rows = $query->get_posts();

もしあなたが$ wpdbを使いたいのなら(私はその理由を知りません)正しい問い合わせは次のようなものです:

<?php
$id = '10'; // unserialized value

global $wpdb;
$rows = $wpdb->get_col( $wpdb->prepare(
  "SELECT DISTINCT $wpdb->posts.ID FROM $wpdb->posts, $wpdb->postmeta
  WHERE $wpdb->posts.ID = $wpdb->postmeta.post_id AND
  $wpdb->posts.post_status = 'publish' AND
  $wpdb->posts.post_type = 'post' AND
  $wpdb->postmeta.meta_key = %s AND
  meta_value = %s",
  'roles_%_production',
  $id
) );
?>

$rowsは投稿IDの配列を含みます。私は$ wpdbの使用に意味をなすためにこの変更を行いました。すべてのフィールドを取得したい場合は、SELECT *ではなくSELECT DISTINCT $wpdb->posts.IDを使用し、$wpdb->get_resultsではなく$wpdb->get_colを使用して、行にGROUP BY $wpdb->posts.IDをクエリに追加します。

6
gmazzap

2つのメモ:

メタデータを検索する

ルールは簡単です:シリアル化されたメタデータ(a:1:{i:0;s:2:"10";}に変換された配列のような)は検索可能であることを意味しません。データセットを単一の値に変換する必要があるため、適切なmeta_query検索を実行できます。

これを検索するための唯一の実際に機能する方法は、データをクエリallし、データをデシリアライズし、条件に一致する場合はレンダリングするか、スキップすることです。 そのトピックをカバーするSOに関する十分な議論とQ/A があります。

準備されたステートメント

like_escape() があり、次のように使用する必要があります。

"%".like_escape( $string )."%"

%文字を事前に追加する必要がある理由は簡単です:LIKEが両端で発生するか、1つだけ(開始、終了、両側)で発生するかを自分で決定できます。

1
kaiser

逆カンマは、10が100にも一致しないようにするためなどです。

正確なメタ値を貼り付けるとうまくいくでしょう。a:1:{i:0; s:2: "10";}

これは、WHEREクエリで、値に=が含まれている%を使用したためです。代わりにLIKEを使用すると、この問題は解決します。 meta_value = %smeta_value LIKE %sに変更すれば、あなたの問い合わせはあなたが完全に直列化された文字列を使ったのと同じように働くはずです。

最新の投稿だけでなく、すべてのリビジョンも返されます。

結果を照会するときは、必ず正しい投稿の種類とステータスを指定してください。改訂ではないすべての投稿を含めたい場合は、(WHEREステートメントの前に)投稿テーブルに必ず参加する必要があります。

LEFT JOIN $wpdb->posts ON $wpdb->posts.ID = $wpdb->postmeta.post_id

そしてWHEREステートメントに次の行を含めます(ANDでリンクされています)。

$wpdb->posts.post_type NOT IN ('revision')
0
Shaun Cockerill