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

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

ただいまの
回答率

88.05%

WordPressでタームのカスタムフィールドを複数追加したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,025

score 6

実現したいこと

WordPressのタームのカスタムフィールドについて、その情報の編集機能を実装したいと考えております。
どなたかupdate_term_meta()周辺機能についてお詳しい方からのご回答をいただけましたら幸いです。

発生している問題

➀「編集画面の追加」 → できた
➁「現在の値の表示」 → できた
➂「新しい値に編集」 → できない
という状況です。

つまり管理画面の「カテゴリーの編集」という画面で、新しい値を入力しても、「更新」をクリックしたら更新されずそのままになってしまいます。

該当のソースコード

「term_color」と「term_shape」という2つのカスタムフィールドを追加したいと思い次のコードを作ってみたのですが、前述のように「➂新しい値に編集」ができない状況です。

👇funcitons.php

// キーと値
function get_termcf_ary(){
    $termcf_ary = [
        'term_color' => 'いろ',        
        'term_shape' => 'かたち'
    ];
    return $termcf_ary;
}

// 編集画面の追加
function animal_taxonomy_custom_fields($tag) {  
    $t_id = $tag->term_id; 
    $termcf_ary = get_termcf_ary();
    foreach( $termcf_ary as $key=>$k ) {
        $get_value = esc_html( get_term_meta( $t_id, $key, true ) ); 
        echo '<tr class="form-field">';        
        echo '    <th scope="row">';
        echo '        <label for="' . $key . '">' . $k . '</label> ';
        echo '    </th>';
        echo '    <td>';
        echo '        <input type="text" id="' . $key . '" name="' . $key . '" value="' . $get_value . '">';
        echo '    </td>';        
        echo '</tr>';    
    }
}  
add_action( 'animal_edit_form_fields', 'animal_taxonomy_custom_fields', 10, 2 );  

// 入力値の保存
function save_taxonomy_custom_fields( $term_id ) {

    // 管理人のみ
    if(!current_user_can('administrator')) { return; }

    // 保存(たぶんここがオカシイ)
    $termcf_ary = get_termcf_ary();
    foreach( $termcf_ary as $key ) {
        if( isset( $_POST['term_meta'][$key] ) && $_POST['term_meta'][$key] ) {
            update_term_meta( $term_id, $key, $_POST['term_meta'][$key] );
        }else{
            update_term_meta( $term_id, $key, '' );
        }
    }
}  
add_action( 'edited_animal', 'save_taxonomy_custom_fields', 10, 2 ); 

試したこと

とりあえず管理画面以外からはどうかと思い、適当にsingle.phpなどに下記を書くと「➂新しい値に編集」ができます。

👇single.php

$term_id = 140;
$meta_value = 'この値は保存される';
update_term_meta( $term_id, 'term_shape', $meta_value ); 


つまり先ほどの、該当のソースコードの// 保存(たぶんここがオカシイ)に問題があるかと思います。

試したこと(追記)

kei344様のご回答を受けて次の値が確認されたので、該当のソースコードの$_POST['term_meta'][$key]$_POST[$key]に変更しましたが、やはり保存されませんでした。

最後の['term_color']"この値は保存される"は、上のsingle.phpから保存できた値です。

そして['term_shape']"1"が管理画面からの入力になりまして、これが保存されません。

array(12) {
 ["action"]=> string(9) "editedtag" 
 ["tag_ID"]=> string(3) "140" 
 ["taxonomy"]=> string(5) "animal" 
 ["_wp_original_http_referer"]=> string(91) "http://examplep.com/wp-admin/edit-tags.php?taxonomy=animal&post_type=book" 
 ["_wpnonce"]=> string(10) "842a933054" 
 ["_wp_http_referer"]=> string(143) "/wp-admin/term.php?taxonomy=animal&tag_ID=140&post_type=book&wp_http_referer=%2Fwp-admin%2Fedit-tags.php%3Ftaxonomy%3Danimal%26post_type%3Dbook" 
 ["name"]=> string(4) "test" 
 ["slug"]=> string(4) "test" 
 ["parent"]=> string(2) "-1" 
 ["description"]=> string(11) "description" 
 ["term_color"]=> string(27) "この値は保存される" 
 ["term_shape"]=> string(1) "1" 
} 

引き続きヒントや確認方法などご指導いただけましたら幸いです。

補足情報(FW/ツールのバージョンなど)

WordPress 5.2.2 
PHP 7.2.13

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

// 保存(たぶんここがオカシイ)
var_dump( $_POST );exit(); // これを挿入して中身を確認してみては?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/08/11 15:19

    なるほど。しかし$_POSTの指定や条件分岐の以前に、

    foreach( $cf_arr as $key ) {
    update_term_meta( $term_id, $key, 'テスト' );
    }

    とやっても「テスト」さえ保存されない状況でした。厄介ですf(´-`;)

    キャンセル

  • 2019/08/11 15:25

    $term_id $key が思った通りに来ているかの確認をしてみてください。

    キャンセル

  • 2019/08/11 15:45

    $key=>$kを忘れていました。最悪すぎます。一日なにしてたんでしょうか………
    付き合わせてしまって申し訳ございませんでした。

    キャンセル

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

  • ただいまの回答率 88.05%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る