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さん
上記のコードだと自動保存のチェックはしていますが、リビジョンのチェックはしていませんので、おそらくそれではないかと思います。
add_action('save_post', 'myplugin_save_postdata', 10, 2 );
function myplugin_save_postdata( $post_id, $post ) {
と書き換えると、保存した記事のオブジェクトを引数として得ることができますので、post_typeやpost_statusでのチェックを差し挟んでみてもらえますか?
jim912さん
早速教えていただいたヒントを元に検証してみた所、
問題が解決されました!
第二引数の$postを使い
if ($post->post_type !== 'revision')//リビジョンでない場合
・
・
・
としたところ、必ず一つずつ要素が追加されるようになりました。
また反対の検証もしまして、
if ($post->post_type == 'revision')//リビジョンの場合
としても一つずつ要素の追加がされました。
最初のコードで1つのときも2つの時もあったのは
タイムラグが無い事による配列の上書きだったと考えられますね。
この度は大変勉強になりました!!
よいプラグインができるようこれからも勉強して行きます^^
ありがとうございました!