質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
WordPress

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

PHP

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

Q&A

解決済

4回答

1687閲覧

WordPressでカスタムフィールドの入力値を配列格納したいです。

kinrinkaryu

総合スコア40

WordPress

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

PHP

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

0グッド

0クリップ

投稿2019/06/01 07:58

編集2019/06/07 08:14

資料皆無でWordPressの管理を引き継ぎました。
以前のデーターはPhpMyAdminで参照するとシリアライズされて格納されています。
a:10:{i:0;a:1:{s:6:"住所";s:9:"福岡市";}i:1;a:1:{s:6:"交通";s:9:"地下鉄";}}
新規投稿でこのカスタムフィールドに入力する値はどのようにすれば、配列として格納されますか?

限りある知識の中でCSVデーターのように入力したところ、
住所,福岡市交通,地下鉄
のようにタダの文字列になっており、配列出力でエラーになりました。
Invalid argument supplied for foreach() in

どのようなフォーマットで入力すれば、正常に配列出力されますか?

補足:関連すると思われるソースコード

ワードプレス本来の/themes/name/single.phpにあたるファイル

PHP

1<!--前提:(引き継ぐ以前に)カスタムフィールドに入力された値は配列としてで格納されている、入力ルールや処理方法は不明。--> 2 <?php if (have_posts()) : ?> <?php while(have_posts()) : the_post(); ?> 3 <?php 4 $title = get_the_title(); 5 $title = $title === '' ? 'タイトルなし' : $title; 6 7 $data = get_post_meta(get_the_ID(), 'data', true);//単一フィールド配列 8 9 $sold_out = get_post_meta(get_the_ID(), 'sold_out', true); 10 $content = get_the_content(); 11 ?> 12 <h1><?php echo $title; ?><?php if ($sold_out === '1') echo '(ご成約)'; ?></h1> 13 <div<?php if ($sold_out === '1') echo ' class="sold-out"'; ?>> 14<!--出力ここから--> 15 <table class=""> 16 <?php foreach($data as $datum): ?><tr><?php foreach($datum as $key => $value): ?><th><?php echo $key; ?></th><td><?php echo $value; ?></td><?php endforeach; ?></tr><?php endforeach; ?> 17 </table> 18<!--出力ここまで--> 19 <!--中略--> 20 <?php endwhile; endif; ?>

追記:wp_postmetaデーブルの一部
_wpcf-etcs-sort-order a:1:{i:0;i:6233;} etcs a:0:{} data a:10:{i:0;a:1:{s:6:"住所";s:9:"福岡市";}i:1;a:1:{s:6:"交通";s:9:地下鉄"";...}
再追記:functions.phpの一部(コメントアウト状態なので無視していたが、念のために。)

PHP

1// add_action('rest_api_init', function () { 2// register_rest_field( 3// 'page', 4// 'post_meta', 5// array( 6// 'get_callback' => function($object, $field_name, $request) { 7// $meta_fields = array( 8// 'wpcf-js', 9// 'wpcf-css', 10// ); 11// $meta = array(); 12// foreach ($meta_fields as $field) { 13// $meta[$field] = get_post_meta($object[ 'id' ], $field, true); 14// } 15// return $meta; 16// }, 17// 'update_callback' => function($value, $object, $field_name) { 18// $js = $value['wpcf-js']; 19// $css = $value['wpcf-css']; 20// update_post_meta($object->ID, 'wpcf-js', $js); 21// update_post_meta($object->ID, 'wpcf-css', $css); 22// } 23// , 24// 'schema' => null, 25// ) 26// ); 27// });

補足2:「WP自体」の記事&フィールドの投稿・更新動作

rest-api-init.phpからの抜き出し、

PHP

1public function add_rest_field($posts, $fields) { 2 global $posts_fields; 3 foreach ($posts as $post) { 4 foreach ($fields as $field) $posts_fields[$post][] = $field; 5 register_rest_field( 6 $post, 7 'post_meta', 8 [ 9 'get_callback' => function($object, $field_name, $request) use ($post) { 10 global $posts_fields; 11 $meta = []; 12 foreach($posts_fields[$post] as $field) { 13 $meta[$field] = get_post_meta($object['id'], $field, true); 14 } 15 return $meta; 16 }, 17 'update_callback' => function($value, $object, $field_name) use ($post) { 18 global $posts_fields; 19 foreach($posts_fields[$post] as $field) { 20 if (!$this->validate($field, $value[$field])) break; 21 update_post_meta($object->ID, $field, $this->set($field, $value[$field])); 22 } 23 }, 24 'schema' => null 25 ] 26 ); 27 } 28}

ほとんど理解できていないが、おそらく肝心なところ↓
$meta[$field] = get_post_meta($object['id'], $field, true);
update_post_meta($object->ID, $field, $this->set($field, $value[$field]));

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

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

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

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

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

guest

回答4

0

ベストアンサー

function customValue2Array2020( $A ){ $supecialArray2020 = array("\r\n", "\r", "\n"); // $supecialArray2020 = array("\r\n", "\r", "\n");// For Plugin : Post Snippets !! $A = str_replace( $supecialArray2020 , "|" , $A); $B = explode("|", $A);// Supecial Thank ! https://qiita.com/suin/items/835ac0f58e6d3bbb6280 $B = array_map('trim', $B); $B = array_filter($B, 'strlen'); $B = array_values($B); return $B ; }

以上はWordPressのテーマ内、header.phpで利用した関数です。
例として、カスタムフィールド名:「 abcd_2020 」だとすると、

if( get_post_custom_values( 'abcd_2020' ) !== null ){};

でカスタムフィールド名が記事に存在するかを判定し、
データーが1つのカスタムフィールドに複数行に渡って登録されていたとしても、

$arr_abcd_2020 = customValue2Array2020( get_post_custom_values( 'abcd_2020' )[ 0 ] );

を実行すると配列として、$arr_abcd_2020 に、代入されます。

※ 初期値ではカスタムフィールドが表示されませんが、編集はWordPressの個別記事編集画面で、当該TEXTAREAで編集するのが簡単かと思います。それとも、phpMyAdminでエキスポートしたSQL構文を編集して、phpMyAdminで一気に置換したのですか?

上記のPHP関数の利用を実践し紹介した当方の愚ブログ記事「第二世代WordPressアイキャッチ静止画と動画

投稿2020/03/03 05:05

編集2020/03/06 21:58
Ujiki.oO

総合スコア27

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

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

kinrinkaryu

2020/03/09 11:18

古い質問にご回答いただき恐縮です、現在この件は無期限停止中なので、確認は後日になりますが、一番近いやり方だと思いましたので、ベストアンサーとしました。
Ujiki.oO

2020/03/09 23:14

「wordpress,array,function,php,customfields,カスタムフィールド,関数,配列」でGoogle検索すると今なら2ページ目に本ページが掲載されていますね。kinrinkaryu さんのタイトルこそが的を射ていると存じます。 一記事に対してカスタムフィールド自体を多重に登録すれば、それ自体が配列ですけど、そんな使い方は行わないと思うんです。さすればカスタムフィールド内で例えば「行送り」を利用して複数の情報を入力する。それを配列変数として扱いたいニーズは高いと思います。「行送り」以外でも良いわけで、今回の関数の呼び出し変数の第二変数で区切り文字の指定を行えれば汎用性が高く、そして運用のヒントになるのかも知れません。
guest

0

情報が足りなさすぎるのでなんとも言えませんが、まずカスタムフィールドが何で作られているのかを調査した方がいいと思います。
functions.php等で定義されているのか、それともAdvancedCustomFieldsのようなプラグインで作られたフィールドなのか。
functions.phpで定義されているのであれば、そのコードを見ない限り正しい答えはわからないかと思います。

ちなみに、フィールドの右側に+ボタン等はないですか?
ACFなどで作成されたフィールドは、行や列を増やすことによって配列化し、それがDB上にシリアライズ化してデータが入ります。
DBを見れるのであれば、post_typeカラムを見ればプラグインかどうかの判別は付くかと。
ACFで作られたフィールドはacf-fieldのようになっているかと思います。
一度、ご確認なさってみてください。

投稿2019/06/06 13:26

suminoel

総合スコア80

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

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

kinrinkaryu

2019/06/07 02:53

ありがとうございます、補足を追加しました。前任はプラグインを使っていません、私がACFを試してみましたが、目的と直結しなかったので、巻き戻し復元済みです。 現在の問題点は前任が「どのようなルールで入力し、配列として格納したか」が全く不明です、そして新たに入力する値はそのままの文字として格納され、出力するときは当然格式に合わないので、エラーになります。 アドバイスを頂けたら幸いです、よろしくお願い致します。
suminoel

2019/06/07 12:15

以前のデータは~と書かれていることから、既にCFが配列として格納されているpostがあるということですよね? DBを見て、該当のpost_idの記事でCFがどのように入力されているか見ればわかるのではないでしょうか?
kinrinkaryu

2019/06/07 12:50

ご返信ありがとうございます、以前のデーターはDBには存在するのですが、編集画面のCFは空白です、調べたらセキュリティの関連で通常は表示されないがのだそうです。それで新規にCFを入力すると新IDのものが追加されるだけでした。 ちなみに、このテーブル形式で出力されるCFデータは、アーカイブ一覧にも使用されるので、手書きする選択肢はないのがネックです。rest-api-init.phpからヒントは得られる気がするのですが、都合よくCFを配列格納する記述がないのが残念なところです。
guest

0

現在の問題点は「新規入力した分がシリアライズされない」ことで、何か「特別な入力書式があるのでは?」と。

普通に配列を作って、

$array = array( '住所' => '福岡市', '交通' => '地下鉄' );

add_post_meta で、$array をカスタムフィールドに保存するとどうなりますか?

投稿2019/06/03 07:23

編集2019/06/03 07:24
CHERRY

総合スコア25171

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

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

kinrinkaryu

2019/06/03 13:56

なるほど、ありがとうございます。 指定して格納したら配列になると言うことは分かりました。 しかしWPの管理(記事編集)画面でカスタムフィールドに入力した値を どうやって区切って取得するのでしょうか? 私の知識レベルでは「カンマやスペース」を区切りのルールとして、入力された文字列を取得分別し、配列に変換して格納するとしか思いつかないのですが、WPの処理にはその部分が見られないので、その区切りルールが不明です。 この場合は「値取得、分別、配列変換」のコードを追記するのがいいでしょうか?
guest

0

WordPress 日本語Codexを見ると
関数リファレンス/add post meta

$$meta_value
(mixed) (必須) カスタムフィールドの値。配列を与えるとシリアライズされて文字列が格納されます。

関数リファレンス/update post meta

$meta_value
(mixed) (必須) カスタムフィールドの新しい値。配列を与えるとシリアル化されます。これは生の値でなければなりません(データベースクエリ時は無害化されます)。

と書いてある

何がしたいのか分からんが仕様なので諦めなはれ

投稿2019/06/01 15:03

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kinrinkaryu

2019/06/03 07:14

ありがとうございます。 現在の問題点は「新規入力した分がシリアライズされない」ことで、何か「特別な入力書式があるのでは?」と。 それで「配列を与えるとシリアル化」の配列はどのような書き方がわからないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問