-
ID:iVo07J さんの質問

Wordpressでカスタムフィールドの値を全て取得したいのですが
get_post_meta($post_id, $key);
基本的にはこれですよね?

これを、$post_idの指定なしでカスタムフィールド名のみの指定で
全て取ってきたいです。
取りたい値はその$keyが指定されている記事のURLなのです。
つまり$post_idを指定して~というのの逆みたいなことがしたいのですが、

実現するにはどうすればいいですか?
今自分でも調べていますが、行き詰まったのでどなたかお願いいたします。

みんなの回答 4 件

ID:SK/odJ さんの回答

get_postsのargsにmeta_queryを$key!=’’な形で指定して、取得できた配列を
回してget_permalinkすれば出来そうですが。

ID:iVo07J

$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件しか表示されませんでした。

ID:SK/odJ

あまりに直接的にお伝えするとよろしくないので、感覚でお伝えしています。valueとかcompareとか使って「$key!=’’」な形を再現すれば指定のカスタムフィールドが空以外の記事を取得できると思います。(もう既に答えいっている感じですが)でも、もしかしたらkeyだけでいけるかもしれませんね。
件数はposts_per_pageも指定してあげると良いのでは?

ID:iVo07J

あぁ、$key!=’’ってのは始めの1文が混乱させましたね。
カスタムフィールドが設定されてるデータを全て取得ではなく、指定したカスタムフィールドが設定されているデータを全て取得、でした。

ID:iVo07J

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 />’;
}

これでいけました!ありがとうございます!

ID:SK/odJ

つまりtestをキーとしたカスタムフィールドが設定された記事のURL全てを抽出ということでしょうか?値は空とか関係なく?
その場合はget_postsでargsに何も指定せずに全件取得して回している中でget_post_custom_keysしてキーの存在を確認して条件分岐するか、$wpdb->get_resultsを使用して直接SQLの結果を取得するかですかね。
あとget_postsの結果を回した直後にsetup_postdataして、回し終わったらwp_reset_postdataしたほうがよいかと。

ID:SK/odJ

meta_key指定だけでいけたんですね。良かったです。
meta_keyはいつもmeta_valueとかと併用して使っていたので単体で動くのは知りませんでした。

ID:iVo07J

詳しくありがとうございます。
上記でもリセットかけたほうがいいですか?
外部PHPでURL取り出して、その結果をjsonで本サイトにつけてるJSで利用する、って感じの使い方なんですけど。
その場合でも本サイト(wordpress)にこのget_posts()が影響しますかね?

ID:SK/odJ

外部で使用でしたね。単体で使用する分にはリセットしなくても良いと思います。

ID:iVo07J

丁寧にありがとうございました!
勉強なりました。

ID:iVo07J さんの回答

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っていうカスタムフィールドを設定してない記事も出てきます。もうなんか意味不明です。

ID:18hWvi さんの回答

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で公開されている投稿から、該当する「キー」の値を抽出します。

ID:50oQ00 さんの回答

直接SQL出しちゃダメなんかな…面倒くさいよ…。

最終更新日:2014-02-22 (8,323 views)

関連するトピックス

ページ上部に戻る