Wordpressでカスタムフィールドの値を全て取得したいのですがget_post_meta($post_id, $key);基本的にはこれですよね?
これを、$post_idの指定なしでカスタムフィールド名のみの指定で全て取ってきたいです。取りたい値はその$keyが指定されている記事のURLなのです。つまり$post_idを指定して~というのの逆みたいなことがしたいのですが、
実現するにはどうすればいいですか?今自分でも調べていますが、行き詰まったのでどなたかお願いいたします。
get_postsのargsにmeta_queryを$key!=’’な形で指定して、取得できた配列を回してget_permalinkすれば出来そうですが。
$key!=’’とはなんですか?下記のようにやってみました。出来そうですが、なんか取って来れたデータが少ないです。あとあんまり関係ないとは思いますが外部PHPからの取得です。testという名前のついたカスタムフィールドを取りだそうとしてみました。
require(’../wp-blog-header.php’);$args = array( ’meta_query’ => array( array( ’key’=>’test’) ));$testposts = get_posts($args);foreach($testposts as $testpost){ echo get_permalink($testpost); echo ’<br />’;}
本来20件以上あるんですが、5件しか表示されませんでした。
あまりに直接的にお伝えするとよろしくないので、感覚でお伝えしています。valueとかcompareとか使って「$key!=’’」な形を再現すれば指定のカスタムフィールドが空以外の記事を取得できると思います。(もう既に答えいっている感じですが)でも、もしかしたらkeyだけでいけるかもしれませんね。件数はposts_per_pageも指定してあげると良いのでは?
あぁ、$key!=’’ってのは始めの1文が混乱させましたね。カスタムフィールドが設定されてるデータを全て取得ではなく、指定したカスタムフィールドが設定されているデータを全て取得、でした。
require(’../wp-blog-header.php’);$args = array( ’meta_key’ => ’test’, ’posts_per_page’ => -1);$testposts = get_posts($args);foreach($testposts as $testpost){ echo get_permalink($testpost); echo ’<br />’;}
これでいけました!ありがとうございます!
つまりtestをキーとしたカスタムフィールドが設定された記事のURL全てを抽出ということでしょうか?値は空とか関係なく?その場合はget_postsでargsに何も指定せずに全件取得して回している中でget_post_custom_keysしてキーの存在を確認して条件分岐するか、$wpdb->get_resultsを使用して直接SQLの結果を取得するかですかね。あとget_postsの結果を回した直後にsetup_postdataして、回し終わったらwp_reset_postdataしたほうがよいかと。
meta_key指定だけでいけたんですね。良かったです。meta_keyはいつもmeta_valueとかと併用して使っていたので単体で動くのは知りませんでした。
詳しくありがとうございます。上記でもリセットかけたほうがいいですか?外部PHPでURL取り出して、その結果をjsonで本サイトにつけてるJSで利用する、って感じの使い方なんですけど。その場合でも本サイト(wordpress)にこのget_posts()が影響しますかね?
外部で使用でしたね。単体で使用する分にはリセットしなくても良いと思います。
丁寧にありがとうございました!勉強なりました。
require(’../wp-blog-header.php’);query_posts(’meta_key=test’);if(have_posts()){ while(have_posts()){ the_post(); echo get_permalink($post->ID); echo ’<br />’; }}
これでも出来ました。これなら20件以上取得されてるんで大体あってるんですが、なんかtestっていうカスタムフィールドを設定してない記事も出てきます。もうなんか意味不明です。
global $wpdb;$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 = ’publish’ AND p.post_type = ’post’ ", "キー" ));
var_dump($r); //配列で値を取得できる
上記の例では投稿タイプがpostで公開されている投稿から、該当する「キー」の値を抽出します。
直接SQL出しちゃダメなんかな…面倒くさいよ…。
みんなの回答 4 件
get_postsのargsにmeta_queryを$key!=’’な形で指定して、取得できた配列を
回してget_permalinkすれば出来そうですが。
require(’../wp-blog-header.php’);
query_posts(’meta_key=test’);
if(have_posts()){
while(have_posts()){
the_post();
echo get_permalink($post->ID);
echo ’<br />’;
}
}
これでも出来ました。
これなら20件以上取得されてるんで大体あってるんですが、なんかtestっていうカスタムフィールドを設定してない記事も出てきます。もうなんか意味不明です。
global $wpdb;
$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 = ’publish’
AND p.post_type = ’post’
", "キー" ));
var_dump($r); //配列で値を取得できる
上記の例では投稿タイプがpostで公開されている投稿から、該当する「キー」の値を抽出します。
直接SQL出しちゃダメなんかな…面倒くさいよ…。
関連するトピックス