あなたの質問に具体的に答えることはかなり難しいです。ただし、最初の部分は簡単です。私は最近、stackoverflowで同様のことをしました
メタキーが比較され、完全に一致します。WP_Query
単純なパラメータでこの動作を調整する手段はありませんが、いつでも自分で導入し、posts_where
節を調整LIKE
してメタキーの比較を行うことができます。
フィルター
これは基本的なフィルターです。必要に応じて調整してください。
add_filter( 'posts_where', function ( $where, \WP_Query $q )
{
// Check for our custom query var
if ( true !== $q->get( 'wildcard_on_key' ) )
return $where;
// Lets filter the clause
$where = str_replace( 'meta_key =', 'meta_key LIKE', $where );
return $where;
}, 10, 2 );
あなたが見ることができるように我々は新しいカスタムパラメータを設定すると、フィルタは、発射されるwildcard_on_key
までtrue
。このチェックアウト、我々は単に変更した場合=
にコンパレータをLIKE
コンパレータ
これについてのメモですが、LIKE
比較は他の比較を実行するために本質的に高価です
クエリ
次のように投稿にクエリを実行するだけで、メタキーを持つすべての投稿を取得できます like_status_{user_id}
$args = [
'wildcard_on_key' => true,
'meta_query' => [
[
'key' => 'like_status_',
'value' => 1,
]
]
];
$query = new WP_Query( $args );
その他の質問
カスタムフィールドはパフォーマンスに影響を与えません。この件に関する私の投稿をここで読むことができます。しかし、私はあなたが各投稿が何百または何千ものいいねをすることができるとあなたが言うので困っています。これにより、このような大量のカスタムフィールドデータの取得とキャッシュのパフォーマンスが低下する可能性があります。また、膨大な量の不要なカスタムフィールドデータがデータベースを詰まらせる可能性があり、メンテナンスが非常に困難になります。
シリアル化されたデータで検索したり、並べ替えたりできないので、カスタムフィールドにシリアル化されたデータを格納することはあまり好きではありません。ただし、すべてのユーザーIDを1つのカスタムフィールドの下の配列に格納することをお勧めします。ユーザーが投稿を気に入ったら、ユーザーIDで配列を更新するだけです。カスタムフィールドデータを取得し、IDの配列をループして、IDで何かを行うのは簡単です。見てくださいget_post_meta()
カスタムフィールドの更新も簡単です。そのため、を調べる必要があり update_post_meta()
ます。カスタムフィールドを作成する方法はわかりませんupdate_post_meta()
が、間違いなく使用したいものです。
カスタムフィールドが更新されたときにメールまたはプッシュ通知を送信する必要がある場合は、次のフックを使用できます。(コンテキストについてはupdate_metadata()
を参照)
結論
これを投稿する直前に、シリアル化されたルートに進む前に、並べ替えられたデータで並べ替えたり、シリアル化されたデータ内の特定のデータを検索したりする必要がないことを確認してください。