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){ ... ... }
任意のアイデアは大歓迎です。
ありがとう
あなたが投稿したコードでは、あなたが言うように「投稿のリスト」を取得するのではなく、メタテーブルの行のリストを取得します。あなたが本当に投稿のリストを取得したい場合は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
をクエリに追加します。
2つのメモ:
ルールは簡単です:シリアル化されたメタデータ(a:1:{i:0;s:2:"10";}
に変換された配列のような)は検索可能であることを意味しません。データセットを単一の値に変換する必要があるため、適切なmeta_query
検索を実行できます。
これを検索するための唯一の実際に機能する方法は、データをクエリallし、データをデシリアライズし、条件に一致する場合はレンダリングするか、スキップすることです。 そのトピックをカバーするSOに関する十分な議論とQ/A があります。
like_escape()
があり、次のように使用する必要があります。
"%".like_escape( $string )."%"
%
文字を事前に追加する必要がある理由は簡単です:LIKE
が両端で発生するか、1つだけ(開始、終了、両側)で発生するかを自分で決定できます。
逆カンマは、10が100にも一致しないようにするためなどです。
正確なメタ値を貼り付けるとうまくいくでしょう。a:1:{i:0; s:2: "10";}
これは、WHEREクエリで、値に=
が含まれている%
を使用したためです。代わりにLIKE
を使用すると、この問題は解決します。 meta_value = %s
をmeta_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')