フォーラムへの返信

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • フォーラム: 自作品の告知
    返信が含まれるトピック: ファイル共有プラグイン
    トピック投稿者 naoya

    (@naoya)

    ただいま公開停止しています。

    フォーラム: プラグイン
    返信が含まれるトピック: 既存のオプション値にデータを追加したい
    トピック投稿者 naoya

    (@naoya)

    jim912さん

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

    第二引数の$postを使い

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

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

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

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

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

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

    フォーラム: プラグイン
    返信が含まれるトピック: 既存のオプション値にデータを追加したい
    トピック投稿者 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が連番だったりした事を考えると
    同じ挙動でプラグインが正しく動作しない可能性があるので
    解決できればと思ったのですが。

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

    トピック投稿者 naoya

    (@naoya)

    コードを見ていてwp_head();の部分で
    前と次の投稿がリンクで読み込まれていたので

    WP-includesの「default-filters.php」の190行あたりの
    add_action( 'wp_head','adjacent_posts_rel_link_wp_head', 10, 0 );

    を削除したらとりあえずは問題なく動くようになりました。

    ご回答ありがとうございました。
    今後の参考にさせていただきます。

4件の返信を表示中 - 1 - 4件目 (全4件中)