先に申し上げておきます。
独自のカスタムフィールドを「あさま」テーマにインクルードしようとしたのですが、とーしても動作してくれずに開発が停止してます。(あさま開発サイトはこちら)
いろいろと調べて、基本的な構成はちゃんと整っているはずなのですがダメなんです。世にあるハウトゥにある「あったりまえ」のところがちゃんとできない。(てか、ちゃんと存在しない。)もう、悔しくて(半べそかきながら)あれやこれや散々調べましたが、ついに一旦諦めて次の独自編集ブロックプラグインの開発(これはこれで難儀してます。)に進んでしまいました。
で、独自カスタムフィールドの紹介できないのです。でも、このブログは自らの忘備録を兼ねてますから、ことの顛末?をサラッとまとめておきます。
もしやしたら、解決策が転がり込んでることを期待してます。自分で気がつくのも含めて…。
カスタムフィールドは、ほかの機能と同様に子テーマの’functions.php’にあさまテーマのメインオブジェクト(’HustleClass.php’のインスタンス)ある関数’rgstCustomFieldSet’を参照する記述をします。
パラメータは多次元配列で、2次元目の連想配列の件数だけカスタムフィールドが登録できるようになっています。連想配列はWordpressの仕様に依ります。
以下、テストのカスタムフィールドです。大谷選手が43本目のホームランを打った頃だったようです。
$obj->rgstCustomFieldSet(array(
//次の連想配列の件数だけカスタムフィールドを登録できる。
array(
'id' => 'customTextField',
'ttl' => '大谷翔平選手の今季成績:カスタムフィールド(テキスト)',
'pst' => ['asama_post'],
'loc' => 'normal',
'prty' => 'high',
'typ' => 'text',
'lbl' => [
'legendLine'=>['注目の項目','成績内容',],
'victoryOrDefeat'=>['勝敗','10勝5敗',true,],
'battingAverage'=>['打率','.308',false,],
'homeRun'=>['本塁打','43',false,],
'runBattedIn'=>['打点','89',false,],
],
),
));
これでカスタムフィールド利用の下準備が済んで、あさまテーマの中で運用を開始します。
‘RegistrationClass.php’のインスタンスが初期化される際にフックを設定します。ページが開いたら関数’addCustomFields’を参照して準備されたカスタムフィールドを表示して利用できるようにし、入力操作などがあったら関数’saveCustomFields’を参照して保存するように仕込みます。
//カスタムフィールドを設置する。
add_action('add_meta_boxes', array($this, 'addCustomFields', 10, 2));
add_action('save_post', array($this, 'saveCustomFields', 10, 3));
編集画面にはつぎのようにフィールドが表示されます。
そんなに長くない記述の関数’addCustomFields’と’saveCustomFields’の定義は以下のとおりです。
public function insCutomTextFields($post,$args) {
//nounceフィールドの追加
wp_nonce_field('hustle_nonce_action', 'hustle_nonce_field');
$ins = '<fieldset name="hustleFieldSet" >';
foreach($args['args'] as $k=>$v) {
// アンダースコアから始まるキー以外の場合
if((preg_match( "/^_/", $k))) {
$ins .= '<legend><span>'.esc_html($v[0]).'</span><span>'.esc_html($v[1]).'</span></legend>';
} else {
$ins .= '<label><span>'.esc_html($v[0]).'</span><input type="text" id="'.esc_html($k).'" name="'.esc_html($k).'" value="'.get_post_meta($post->ID, $k, true).'" size="" maxlength="" placeholder="'.esc_html($v[1]).'"></label>';
$CustomFieldKeys[] = $k;
}
}
$ins .= '</fieldset>';
echo $ins;
}
public function saveCustomFields($pstID, $pst, $update) {
//nonceがセットされているか確認
if(!isset($_POST['hustle_nonce_field'])) return;
//nounceが正しいか検証
if(!wp_verify_nonce($_POST['hustle_nonce_field'], 'hustle_nonce_action')) return;
if($update) {
foreach($this->CustomFieldKeys as $v) {
$this->HSTL->echoo('COSTOM_FIELD_NAME_>'.$v.'VALUE_>'.$_POST[$v]);
if(!empty($_POST[$v])) {//入力の有無を確認
update_post_meta($pID, $v, $_POST[$v]);//値を保存
} else {
update_post_meta($pstID, $v, '');//値を空に
}
}
}
}
関数’addCustomFields’は全く問題がないようです。ところが、関数’saveCustomFields’で最初に参照される’$_POST’が空っぽで保存動作が進まないのです。
この’$_POST’はPHPのスーパーグローバル変数と言ってどこからでも参照できる変数なのです。呼べば来てくれるスーパーヒーローのはずですがあ…。ちゃんとフックがあって関数’saveCustomFields’が呼び出されて…、そのアーギュメントも揃っているにも関わらず…、スーパーヒーローは空っぽになってしまうのです。
どこで間違えたのかと、あさまテーマのオブジェクト群を使わずに’functions.php’に平たく書いてもダメでした。
もちろん、プラグインも切って、テーマをWordpessの’Twenty Twenty-Three’にしてもダメでした。
散々に調べてもエラーログを取っても、どうしてもスーパーヒーローはやってこない。ウェブ上のさまざまな情報では当たり前のように’$_POST’を参照している…、どうしたことか。
相当数に試行しました。時間もかかってしまいました。ついにはドメイン名が悪いとしか思えなくなるほどでした。
この原稿を書いていて、ふと、子テーマの’functions.php’だからいけないのかと思いましたが、そんなはずはない。
でも試すか。
そういったわけで独自カスタムフィールドの開発は、とりあえず停止することにしました。いろいろ調べたら、いつもなら情報元に感謝を示すのですが、それもできません。残念。
全く諦めたわけではありませんので、またそのうち再度検証してみたいと思います。
うーむ。やっぱ、意味ない投稿になったんじゃないかな。そかさ。