サポート » プラグイン » 既存のオプション値にデータを追加したい

  • 解決済 naoya

    (@naoya)


    現在プラグインの作成をしています。
    関数リファレンス/add meta boxのコードを参考にして
    参考コードの「データ入力用の実際のフォーム」の部分をチェックボックスとして
    投稿保存と同時にPOSTデータをデータベースに保存したいと考えています。

    「承認ができたのでデータを探して保存」以降を下記のようにします。

    $opt_name = 'test_name';
    $opt_val = get_option( $opt_name );//オプションの値を取得する(既に連想配列の状態と仮定)
    
    $time = time();//テスト用データ
    $opt_val += array('hoge-'.$time => $time);//配列にデータを追加
    update_option($opt_name,$opt_val);//オプションの値を更新

    ↑テスト用データはPOSTデータの代わりです。
    $opt_valの初期値は

    [hoge-1320152661] => 1320152661

    とした場合、これに配列を追加して行くと

    [hoge-1320152661] => 1320152661
    [hoge-1320152662] => 1320152662
    [hoge-1320152978] => 1320152978

    となるのですが、なぜか一回の更新で2つ配列が入る時があります。
    1つの配列が追加される時もあり、これを常に1ずつにしたいと考えております。

    がしかし、何が原因なのか見当もつかず困り果てております。
    参考になりそうなURLでも結構です。
    もしお分かりになる方がいらっしゃいましたらお力添えしていただきたく投稿いたしました。
    宜しくお願いいたします。

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • モデレーター jim912

    (@jim912)

    naoyaさん、こんにちは。

    コードの一部しか分からないことと、利用しているプラグインなどが分からないので、かなりの憶測となりますが、自動保存やリビジョンの記録あたりが怪しいですね。

    トピック投稿者 naoya

    (@naoya)

    jim912さん

    お返事ありがとうございます。
    基本的にはリンク先の用例コードを使用して新しいプラグインの開発を行っています。
    既存のプラグインは全て無効化しています。

    以下リンク先コードを途中一部抜粋したものを元に、
    テスト用データをデータベースに保存します。↓

    /* 投稿を保存した際、カスタムデータも保存する */
    function myplugin_save_postdata( $post_id ) {
    
      // データが先ほど作った編集フォームのから適切な認証とともに送られてきたかどうかを確認。
      // save_post は他の時にも起動する場合がある。
    
      if ( !wp_verify_nonce( $_POST['myplugin_noncename'], plugin_basename(__FILE__) )) {
        return $post_id;
      }
    
      // 自動保存ルーチンかどうかチェック。そうだった場合はフォームを送信しない(何もしない)
      if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE )
        return $post_id;
    
      // パーミッションチェック
      if ( 'page' == $_POST['post_type'] ) {
        if ( !current_user_can( 'edit_page', $post_id ) )
          return $post_id;
      } else {
        if ( !current_user_can( 'edit_post', $post_id ) )
          return $post_id;
      }
    
      // 承認ができたのでデータを探して保存
    
     $opt_name = 'test_name';
     $opt_val = get_option( $opt_name );//オプションの値を取得する(既に連想配列の状態と仮定)
    
     $time = time();//テスト用データ
     $opt_val += array('hoge-'.$time => $time);//配列にデータを追加
     update_option($opt_name,$opt_val);//オプションの値を更新
    }
    ?>

    このコードを実行するとデータベースに2つの異なる時間の配列が記録されます。

    「承認ができたのでデータを探して保存」の部分を実際のPOSTデータに置き換えると

    $opt_name = 'test_name';
     $opt_val = get_option( $opt_name );//オプションの値を取得する(既に連想配列の状態と仮定)
    
     $mydata = $_POST['myplugin_new_field'];//POSTデータ=投稿ID番号
     $opt_val += array('hoge-'.$mydata => $mydata);//配列にデータを追加
     update_option($opt_name,$opt_val);//オプションの値を更新

    とした場合、配列に追加されるのは
    array('hoge-'.$mydata => $mydata);
    の一つのみです。

    しかし実際にはtime()と違い値が変わらないために上書きされて
    1つの配列が追加されているように見えるだけではないかと思っています。

    自動保存やリビジョンは怪しい気がしています。
    ですがリンク元のコードのように自動保存時は関数が止まるはずなので
    (コードがあっていればの話ですが)
    別の理由もあるのかな?とも思ったり。。

    配列キーが動的になったり、連想配列ではなく通常の配列のときに
    キーが連番だったりすると同じような挙動になり、
    今後投稿IDが連番だったりした事を考えると
    同じ挙動でプラグインが正しく動作しない可能性があるので
    解決できればと思ったのですが。

    もう少し調べてみます。
    引き続きお力添え宜しくお願いします。

    モデレーター jim912

    (@jim912)

    naoyaさん

    上記のコードだと自動保存のチェックはしていますが、リビジョンのチェックはしていませんので、おそらくそれではないかと思います。

    add_action('save_post', 'myplugin_save_postdata', 10, 2 );
    function myplugin_save_postdata( $post_id, $post ) {

    と書き換えると、保存した記事のオブジェクトを引数として得ることができますので、post_typeやpost_statusでのチェックを差し挟んでみてもらえますか?

    トピック投稿者 naoya

    (@naoya)

    jim912さん

    早速教えていただいたヒントを元に検証してみた所、
    問題が解決されました!

    第二引数の$postを使い

    if ($post->post_type !== 'revision')//リビジョンでない場合
    ・
    ・
    ・

    としたところ、必ず一つずつ要素が追加されるようになりました。

    また反対の検証もしまして、

    if ($post->post_type == 'revision')//リビジョンの場合

    としても一つずつ要素の追加がされました。
    最初のコードで1つのときも2つの時もあったのは
    タイムラグが無い事による配列の上書きだったと考えられますね。

    この度は大変勉強になりました!!
    よいプラグインができるようこれからも勉強して行きます^^
    ありがとうございました!

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • トピック「既存のオプション値にデータを追加したい」には新たに返信することはできません。