🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

1506閲覧

WP:カスタムフィールドのキー指定について、「キーは不明だけど、そのユーザーが持っているもの」という指定は可能か?

ringorin

総合スコア40

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/09/23 19:26

お世話になります。Wordpress のget_user_meta() で、カスタムフィールドのキーを指定する方法について教えてください。

###前提
下記のように、ユーザーごとに持っているカスタムフィールドがバラバラだとします。

A君のカスタムフィールド meta_1、meta_2 B君のカスタムフィールド meta_1、meta_5、meta_7

###質問
このようなときに、【A君が持っている「meta_?」】という指定で、値を取得する方法はございますか?

たとえば通常、A君のカスタムフィールドを取得するなら下記のようにすると思います。

function getAkunMeta($Akun_id){ $AkunMeta = []; $AkunMeta[] = get_user_meta( $Akun_id, 'meta_1' ); $AkunMeta[] = get_user_meta( $Akun_id, 'meta_2' ); return $AkunMeta; }

ですが今回は、【後ろの数字が決まっておらず、とりあえずA君が持っている「meta_?」を「$AkunMeta」に取得したい】というパターンになります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

user_metaってfirst_nameとかlast_nameとかも入ってるから
全部取得すると絞り込み面倒だし、SQL自前でやる方が手っ取り早いかも

php

1function get_user_meta_by_fuzzy_key($user_id){ 2 global $wpdb; 3 return $wpdb->get_col("SELECT meta_value FROM {$wpdb->usermeta} WHERE user_id = {$user_id} AND meta_key LIKE '{$key}'"); 4} 5$Akun_meta=get_user_meta_by_fuzzy_key($Akun_id,"meta_%");

ただしフィルタもアンシリアライズ処理も走らないから
その辺で問題起きるかもしれないので安全とは言い難し

投稿2019/09/24 03:24

編集2019/09/24 03:29
KazuhiroHatano

総合スコア7819

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ringorin

2019/09/24 08:20

そんな書き方があるとわ。どうもありがとうございます!理想としていたもののようです。 以下、安全性について1点よろしいですか? 値の保存は、ユーザーがPOSTしたり、管理画面にアクセスして保存したり、というわけではなく、functions.phpで下記の流れを経て保存されます。 この流れにユーザー側で操作可能なものはなく、なので「>フィルタもアンシリアライズ処理も」いずれも不要という認識を持っているのですが、安全性について問題ありそうでしょうか? // 既存の情報と新しい情報を結合して保存 function save_user_meta(){ $his_id = get_current_user_id(); $fuzzy_meta = get_user_meta_by_fuzzy_key( $user_id ); foreach( $fuzzy_meta as $key => $val ){ // 保存する値を作る $date = get_date( $key ); $number = get_new_number( $key ); $new_meta = [ $date => $numbar ]; // 既存の値と結合して保存する $current_meta = get_user_meta( $his_id , $key ); $save_meta = array_merge( $new_meta, $current_meta ); update_user_meta( $his_id, $save_meta ); } }
KazuhiroHatano

2019/09/24 08:45

add_user_metaで配列を直接入れたりしてたらアンシリアライズしないと不具合になります まあ対処は return array_map( 'maybe_unserialize',$wpdb->get_col(...... とちょっと戻り値に処理を足してやりゃいいだけなんですが フィルタの方は、見たことはないですがget_user_metadataフィルタを使った プラグインがあったとしたらそれが動作不良を起こすことになります あるとしたらキャッシュのプラグインとかですかね NoSQLなカスタムフィールドとかってのもありそうかも まあ、早々使わないフィルタな気がします
ringorin

2019/09/24 12:25 編集

お詳しい!ありがとうございます。そして maybe_unserilalize 便利ですね。覚えておきます。 思ったのですが、「どのキーの値か」をセットで取得できますか? function get_user_meta_by_fuzzy_key( $user_id, $key ){ global $wpdb; $result = []; $datas = $wpdb->get_col("SELECT meta_value FROM {$wpdb->usermeta} WHERE user_id = {$user_id} AND meta_key LIKE '{$key}'"); foreach ( $datas as $data ) { $result[] = [ 'key' => '', // meta_1 というキーをここに入れてあげたい 'val' => $data // meta_1' の値をここに入れてあげたい ]; } return $result; } $Akun_meta=get_user_meta_by_fuzzy_key($Akun_id,"meta_%"); var_dump($Akun_meta); ↓つまり次のようにしたい [ [ 'key'=>'meta_1', 'val' => 'aaa' ], [ 'key'=>'meta_2', 'val' => 'bbb' ] ]
KazuhiroHatano

2019/09/24 12:23

$wpdb->get_results("SELECT meta_key, meta_value .... に、戻り値は2次配列になるはずなのでvar_dumpして構造を確認
ringorin

2019/09/24 12:26

なるほど、ありがとうございます。挑戦してみます。
ringorin

2019/09/24 12:39 編集

var_dumpの結果ですが、下記のように aaa や bbb という値が出るだけで、meta_1 や meta_2 などのキー名はありませんでした。 function get_user_meta_by_fuzzy_key($user_id, $key){ global $wpdb; return $wpdb->get_col("SELECT meta_value FROM {$wpdb->usermeta} WHERE user_id = {$user_id} AND meta_key LIKE '{$key}'"); } $Akun_meta=get_user_meta_by_fuzzy_key(HIS_ID,"cf_vote_count_%"); var_dump($Akun_meta); ↓結果 array(2) { [0]=> string(3) "aaa" [1]=> string(3) "bbb" }
ringorin

2019/09/24 12:40 編集

そこで一階層前はどうかと思い下記で見ましたが、こうするとすべてのカスタムフィールドの値が取得できたものの、やはり meta_1 や meta_2 などのキー名はは見当たらずで、はてなです。 function get_user_meta_by_fuzzy_key($user_id, $key){ global $wpdb; return $wpdb->get_col("SELECT meta_value FROM {$wpdb->usermeta} WHERE user_id = {$user_id} "); } $Akun_meta=get_user_meta_by_fuzzy_key(HIS_ID,"cf_vote_count_%"); var_dump($Akun_meta); ↓結果 array(157) { /* 全てのカスタムフィールドの値(キー名なし) */ }
KazuhiroHatano

2019/09/24 12:47

$wpdb->get_col("SELECT meta_value ↓ $wpdb->get_results("SELECT meta_key, meta_value
ringorin

2019/09/24 13:10

すみません、よく見ていませんでした。キー名も含めて取得したいときはmeta_keyも書くのですね。できました! さらにarray_columnで目当てのキーを指定できるぞと。どうもありがとうございました。やっと先に進めそうです。
ringorin

2019/09/24 13:16

ところで「%」というのは、SQLでは「未定の文字列が何文字か」という意味であっていますか? つまりPHPやJSの正規表現で「.」と同じでしょうか?
ringorin

2019/09/24 13:38

なるほどー。検索などはこういう仕組みで取得されているわけですね。ありがとうございました。大変勉強になりました。
ringorin

2019/09/24 14:21

夜分に大変ぶしつけなお願いですが、お時間ございましたら https://teratail.com/questions/213579 もご覧いたければ幸いです…笑 edit_user_profile_update() のちゃんとした使い方、みたいなものを探していまして、お詳しそうなのでもしよかったら…
guest

0

キーを渡さなければカスタムフィールド全部を返すので、それを使えばよいです。

PHP

1function getAkunMeta($Akun_id){ 2 return get_user_meta( $Akun_id ); 3}

【get_user_meta – WordPress私的マニュアル】
https://elearn.jp/wpman/function/get_user_meta.html

投稿2019/09/23 19:32

kei344

総合スコア69596

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ringorin

2019/09/23 19:42

【A君が持っている全て】ですか。ありがとうございます。 ところで全て取得できた中に「meta_1」があるのか「meta_2」があるのかわかりませんから、結局「meta_?」の取得はどうするのでしょうか? あと全てを介さず、初めから【A君が持っている「meta_?」】という指定はできませんか?
kei344

2019/09/23 19:50

配列が返ってくるので後は普通に探せばよいだけだと思いますよ。 【【PHP】連想配列の作成と、連想配列のキー・値を取得し出力する例】 https://blog-and-destroy.com/2651 【PHPで特定な配列キーを正規表現で取得します | 古松】 https://old-pine.net/index.php/content/php%E3%81%A7%E7%89%B9%E5%AE%9A%E3%81%AA%E9%85%8D%E5%88%97%E3%82%AD%E3%83%BC%E3%82%92%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%E3%81%A7%E5%8F%96%E5%BE%97%E3%81%97%E3%81%BE%E3%81%99 > 初めから そういう関数はないので、ご自身で作ればよいです。
ringorin

2019/09/24 07:54

>普通に探せば 正規表現でそう指定するんですね。ありがとうございます。 >ご自身で作れば なるほどw失礼しました汗
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問