カスタムフィールドキーのすべての値を取得する(クロスポスト)
-
-
これを分類法として使用しているようです.保存するときに、これらの投稿に単純に(自動的に)用語を追加してみませんか?クエリがはるかに簡単になります.Seems like you're using this as a taxonomy. Why not simply (automatically) add a term to these posts when saving? Would make querying a lot easier.
- 5
- 2011-02-15
- kaiser
-
@kaiser天才になってくれてありがとう!@kaiser I can't thank you enough for being a genius!
- 0
- 2016-10-26
- user2128576
-
7 回答
- 投票
-
- 2011-02-15
考えられるアプローチの1つは、WPDBクラスのヘルパーメソッドの1つを使用して、より洗練されたメタベースのクエリを実行することです.ただし、これらの関数の一部を使用する場合の注意点は、通常、単純なデータ配列を取得せず、1つの列または行のみを呼び出している場合でも、オブジェクトのプロパティを不必要に参照する必要があることです.
もちろん、すべての関数が同じであるとは限りません.意図的に言及しているのは、 WPDB メソッド
get_col
です.このメソッドは単純なフラット配列を返します.照会されたデータについては、次の例でこのメソッドが呼び出されるため、特に言及します.WordPress-WPDBデータの列の選択
$ wpdb->get_col()これは、選択した投稿タイプ、投稿ステータス、および特定のメタキー(または技術的知識の少ないカスタムフィールド)のすべての投稿をデータベースに照会する関数の例です.
function get_meta_values( $key = '', $type = 'post', $status = 'publish' ) { global $wpdb; if( empty( $key ) ) return; $r = $wpdb->get_col( $wpdb->prepare( " SELECT pm.meta_value FROM {$wpdb->postmeta} pm LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id WHERE pm.meta_key = %s AND p.post_status = %s AND p.post_type = %s ", $key, $status, $type ) ); return $r; }
たとえば、投稿タイプが movies の場合、メタキーが の投稿を見つけたい場合> その情報を変数内に格納したい場合、そのような呼び出しの例は次のようになります.
$movie_ratings = get_meta_values( 'rating', 'movies' );
そのデータを画面に出力する以外に何もしたくない場合は、PHPのimplode関数を使用すると、その単純な配列をデータの行にすばやく接続できます.
// Print the meta values seperate by a line break echo implode( '<br />', get_meta_values( 'YOURKEY' ));
たとえば、返されたデータを使用して、返されたデータに対して単純なループを実行し、カウントの配列を作成することで、これらのメタ値を持つ投稿の数を計算することもできます.
$movie_ratings = get_meta_values( 'rating', 'movies' ); if( !empty( $movie_ratings ) ) { $num_of_ratings = array(); foreach( $movie_ratings as $meta_value ) $num_of_ratings[$meta_value] = ( isset( $num_of_ratings[$meta_value] ) ) ? $num_of_ratings[$meta_value] + 1 : 1; } /* Result: Array( [5] => 10 [9] => 2 ) // ie. there are 10 movie posts with a rating of 5 and 2 movie posts with a rating of 9. */
このロジックは、さまざまな種類のデータに適用でき、さまざまな方法で機能するように拡張できます.ですから、私の例が役に立ち、従うのに十分シンプルであることを願っています.
One possible approach would be to use one of the helper methods in the WPDB class to do a more refined meta based query. The caveat to using some of these functions however, is that you don't usually get back a simple array of data and usually have to make needless references to object properties, even if you're only calling for one column or row.
Of course, not all functions are the one and the same, and a purposeful mention goes out to the WPDB method,
get_col
which returns a simple flat array of the data queried for, i make this mention specifically because the example following will call upon this method.WordPress - WPDB Selecting a column of data
$wpdb->get_col()Here's an example function which queries the database for all posts of a chosen post type, post status and with a specific meta key(or custom field to the less technically minded).
function get_meta_values( $key = '', $type = 'post', $status = 'publish' ) { global $wpdb; if( empty( $key ) ) return; $r = $wpdb->get_col( $wpdb->prepare( " SELECT pm.meta_value FROM {$wpdb->postmeta} pm LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id WHERE pm.meta_key = %s AND p.post_status = %s AND p.post_type = %s ", $key, $status, $type ) ); return $r; }
So for example, if you like to find out which posts have a meta key of rating, for the post type movies and you'd like to store that information inside a variable, an example of such a call would be..
$movie_ratings = get_meta_values( 'rating', 'movies' );
If you wanted to do nothing more than print that data to screen, PHP's implode function can quickly splice that simple array into lines of data.
// Print the meta values seperate by a line break echo implode( '<br />', get_meta_values( 'YOURKEY' ));
You can also use the returned data to work out how many posts have these meta values by doing a simple loop over the returned data and building an array of the counts, for example.
$movie_ratings = get_meta_values( 'rating', 'movies' ); if( !empty( $movie_ratings ) ) { $num_of_ratings = array(); foreach( $movie_ratings as $meta_value ) $num_of_ratings[$meta_value] = ( isset( $num_of_ratings[$meta_value] ) ) ? $num_of_ratings[$meta_value] + 1 : 1; } /* Result: Array( [5] => 10 [9] => 2 ) // ie. there are 10 movie posts with a rating of 5 and 2 movie posts with a rating of 9. */
This logic could be applied to various kinds of data, and extended to work any number of different ways. So i hope my examples have been helpful and simple enough to follow.
-
また、将来の視聴者にとっては、一意のメタ値のみを取得する場合は、上記の関数の「SELECT」の直後に「DISTINCT」と入力します.役に立つかもしれません.Also fun-fact for future viewers, if you want to pull only Unique meta values - you type `DISTINCT` right after the `SELECT` in the function above. Could be useful.
- 3
- 2014-02-07
- Howdy_McGee
-
これは非常に便利だと思いますI think this is extremely useful
- 0
- 2017-05-01
- Pablo S G Pacheco
-
これを行う方法、およびソートされた値を返す方法は?、ORDERbyを使用すると思いますが、使用方法がわかりませんHow to do this, and return the values sorted?, I think that using ORDER by but I cant figure out how to use it
- 0
- 2018-04-17
- efirvida
-
-
同じ値の複数のメタ値を持つことが有効であり、したがってコードにその追加を行わなかった場合を想像することができます.明確な値が必要な場合は、これが最適な方法です.さらに、それを関数の引数として追加することもできます(必要に応じて、使用するかどうかを指定できます).I can imagine cases where it would be valid to have multiple meta values of the same value, and thus didn't not make that addition to my code. If you want distinct values, this would be the way to go though. Additionally you could also add that in as an argument for the function(so you can use it or not, as appropriate).
- 1
- 2014-01-24
- t31os
-
-
- 2015-10-03
グローバル$ wpdbを使用するのは適切ではないか、必要ありません:
// function to grab all possible meta values of the chosen meta key. function get_meta_values( $meta_key, $post_type = 'post' ) { $posts = get_posts( array( 'post_type' => $post_type, 'meta_key' => $meta_key, 'posts_per_page' => -1, ) ); $meta_values = array(); foreach( $posts as $post ) { $meta_values[] = get_post_meta( $post->ID, $meta_key, true ); } return $meta_values; } $meta_values = get_meta_values( $meta_key, $post_type );
It is not good or needed to use the global $wpdb:
// function to grab all possible meta values of the chosen meta key. function get_meta_values( $meta_key, $post_type = 'post' ) { $posts = get_posts( array( 'post_type' => $post_type, 'meta_key' => $meta_key, 'posts_per_page' => -1, ) ); $meta_values = array(); foreach( $posts as $post ) { $meta_values[] = get_post_meta( $post->ID, $meta_key, true ); } return $meta_values; } $meta_values = get_meta_values( $meta_key, $post_type );
-
ほとんどの場合、これが私の好ましい方法です.1つではなく5つのクエリを作成しますが、標準のWordPressプロシージャを使用してクエリを生成および送信するため、プラットフォーム固有のキャッシュ(WPエンジンのオブジェクトキャッシュやランダムプラグインなど)が開始されます.データもリクエストの間、WordPressの内部キャッシュに保存されるため、必要に応じてデータベースから再度取得する必要はありません.This would be my preferred method of doing it, in most cases. It makes five queries, rather than just one, but, as it's using the standard WordPress procedures to generate and submit them, any platform-specific caching (such as WP Engine's Object Caching or some random plugin) will kick in. The data will also be stored in WordPress' internal cache for the duration of the request, so will not need to be retrieved from the database again, if needed.
- 0
- 2017-06-02
- Andrew Dinmore
-
フィルタはデータにも適用されます.これは、たとえば多言語サイトでは非常に重要になる可能性があります.最後に、標準のWordPressコア機能のみを使用しているため、将来のアップデートによって破損する可能性ははるかに低くなります.Any filters will also be applied to the data, which could be extremely important on, for example, a multi-lingual site. Lastly, since it's using just standard WordPress core functions, it's much less likely to be broken by a future update.
- 0
- 2017-06-02
- Andrew Dinmore
-
これは、クエリを投稿IDに制限することで、パフォーマンスが向上する可能性がありますか? 追加: `'fields'=> 'ids'` したがって、クエリ配列は次のようになります. `` `array( 'post_type'=> $post_type、 'meta_key'=> $meta_key、 'posts_per_page'=> -1 'フィールド'=> 'ids' ) `` `This might be made more performant by limiting the query to post id? Add: `'fields' => 'ids'` So, the query array would look like: ```array( 'post_type' => $post_type, 'meta_key' => $meta_key, 'posts_per_page' => -1, 'fields' => 'ids' )```
- 1
- 2020-04-13
- Pea
-
注意これは、公開されていない投稿にのみ存在するメタ値も除外するため、「post_status」引数を使用して、これをバグではない機能にするようにしてください.Caution this also filters out meta values that exist only on not published posts so make sure you use the 'post_status' arg to make this a feature not a bug
- 0
- 2020-07-23
- jnhghy - Alexandru Jantea
-
- 2011-02-15
最速の方法はカスタムSQLクエリで、よくわかりませんが、試すことができます
$wpdb->get_results(" SELECT posts.* , COUNT(*) 'moodcount' FROM $wpdb->posts as posts JOIN $wpdb->postmeta as postmeta ON postmeta.post_id = posts.ID AND postmeta.meta_key = 'Mood' GROUP BY postmeta.meta_key ");
どちらかといえば、それが始まりです.
the fastest way would be a custom sql query and i'm not sure but you can try
$wpdb->get_results(" SELECT posts.* , COUNT(*) 'moodcount' FROM $wpdb->posts as posts JOIN $wpdb->postmeta as postmeta ON postmeta.post_id = posts.ID AND postmeta.meta_key = 'Mood' GROUP BY postmeta.meta_key ");
If anything then its a start.
-
感謝しますが、カスタムクエリは「絶対に」避けるべきではありませんか?私はWP抽象化レイヤーを使用したいと思います(それはそれが呼ばれているものですか?)...しかしもちろんこれが不可能な場合..thanks, but shouldn't custom quesries be avoided 'at all cost'? I'd prefer to use the WP abstraction layer (is that what it's called?)... but of course if this is not possible..
- 1
- 2011-06-08
- mikkelbreum
-
カスタムクエリは、正しい方法で記述されている場合、より適切になる可能性があり、何をしているのかわからない場合にのみ回避する必要があります.Custom queries, if written the right way, can be better and you should only avoid them if you don't know what you're doing.
- 0
- 2011-06-08
- Bainternet
-
私はmwbに同意します.カスタムクエリは非常に便利で実用的ですが、DB上でもはるかに重いと思います.特にSRT関数を使用します.I Agree with mwb .custom queries are very usefull and practical, but I think they are also much heavier on the DB.. especially using SRT functions..
- 1
- 2011-12-10
- krembo99
-
- 2013-09-07
メタキーですべてのメタ値を取得する場合
$values = $wpdb->get_col("SELECT meta_value FROM $wpdb->postmeta WHERE meta_key = 'yourmetakey'" );
For getting all meta values by a meta key
$values = $wpdb->get_col("SELECT meta_value FROM $wpdb->postmeta WHERE meta_key = 'yourmetakey'" );
-
このアプローチの問題は、特異性の欠如です.このようなクエリからは、下書き、ゴミ箱に入れられたアイテム、投稿、ページ、その他の存在する投稿タイプなど、多数の結果が得られます.不要なものを照会することは絶対にしないでください.ここでは確実に特異性が必要です.The issue with this approach is the lack of specificity, you'll get numerous results from such a query, which could include drafts, trashed items, posts, pages, and any other post type that exists. You should never query for what you don't need, specificity is most certainly required here.
- 3
- 2014-01-24
- t31os
-
他の投稿タイプやステータスから値を取得できることは事実ですが、必要なのは値だけであり、必要な場所以外でそのmeta_keyを使用していない場合があります.すべて/ほとんどの値が一意である場合、これが最善の解決策である可能性があります.While it is true that you could get values from other post types and statuses, there are times when all you need are the values and you haven't used that meta_key anywhere but where you need it. If all/most values are unique, this may be the best solution.
- 0
- 2018-06-23
- Luke Gedeon
-
- 2012-01-31
t31osとBainternetのコードをマージして、1回の効率的な操作でカウントと値を返す再利用可能なプリペアドステートメント(ワードプレススタイル)を作成できない理由はありません.
これはカスタムクエリですが、WordPressデータベース抽象化レイヤーを使用しています.たとえば、テーブル名が実際に何であるか、またはテーブル名が変更されているかどうかは関係ありません.プリペアドステートメントであるため、より安全です. SQL攻撃など
この場合、投稿タイプをチェックしなくなり、空の文字列を除外します:
$r = $wpdb->get_results( $wpdb->prepare( " SELECT pm.meta_value AS name, count(*) AS count FROM {$wpdb->postmeta} pm LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id WHERE pm.meta_key = '%s' AND pm.meta_value != '' AND p.post_type = '%s' GROUP BY pm.meta_value ORDER BY pm.meta_value ", $key, $type) ); return $r;
これは特に
これにより、次のようなオブジェクトの配列が返されます:
array 0 => object(stdClass)[359] public 'name' => string 'Hamish' (length=6) public 'count' => string '3' (length=1) 1 => object(stdClass)[360] public 'name' => string 'Ida' (length=11) public 'count' => string '1' (length=1) 2 => object(stdClass)[361] public 'name' => string 'John' (length=12) public 'count' => string '1' (length=1)
There's no reason why you can't merge t31os and Bainternet's code to have a reusable prepared statement (wordpress style) that returns the count and the values in one efficient operation.
It's a custom query but it's still using the wordpress database abstraction layer - so for example it doesn't matter what the table names really are, or if they change, and it's a prepared statement so we're that much safer from SQL attacks etc.
In this instance I'm no longer checking for post type and I'm excluding empty strings:
$r = $wpdb->get_results( $wpdb->prepare( " SELECT pm.meta_value AS name, count(*) AS count FROM {$wpdb->postmeta} pm LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id WHERE pm.meta_key = '%s' AND pm.meta_value != '' AND p.post_type = '%s' GROUP BY pm.meta_value ORDER BY pm.meta_value ", $key, $type) ); return $r;
In this particular is
This will return an array of objects like so:
array 0 => object(stdClass)[359] public 'name' => string 'Hamish' (length=6) public 'count' => string '3' (length=1) 1 => object(stdClass)[360] public 'name' => string 'Ida' (length=11) public 'count' => string '1' (length=1) 2 => object(stdClass)[361] public 'name' => string 'John' (length=12) public 'count' => string '1' (length=1)
-
-
post_idが指定されていない場合、これはデフォルトで現在の投稿になります.Note that this defaults to the current post, when no post_id is specified.
- 0
- 2017-07-29
- birgire
-
特定の投稿のカスタムフィールド値を取得する方法を知っています.
必要なのは、すべての投稿にわたって特定のカスタム投稿キーに関連付けられているすべての値を取得することです.
これを行う効率的な方法を知っている人はいますか?DB内のすべての投稿IDをループしたくありません.
例:
4件の投稿はすべて、「ムード」というカスタムフィールドの値が異なります. 2つの投稿の値は「幸せ」、1つの投稿の値は「怒り」、1つの投稿の値は「悲しい」
出力したい:私たちが持っているすべての投稿にわたって:2人の幸せ、1人の怒り、1人の悲しい著者.
ただし、多数の投稿があります.
私が探しているのは次のいずれかです: