前提・実現したいこと
WordPressです。サイト読み込みにおいて、テーマ内ファイルに書いた関数を1回しか実行させない方法を知りたいです。
発生している問題
例えばwp_insert_postをfunctions.phpに書くと、なぜか3回実行され、3件のレコードがINSERTされてしまいます。(wp_insert_postに限りません)
該当のソースコード
php
1// functioins.php 2wp_insert_post( [ 'post_title'=>'a', 'post_content'=>'b' ] ); 3 4error_log('この文はサイト読み込みにおいて3回表示されてしまう');
調べたこと
ググると類似の質問が2つあり、functions.phpを複数回読むというのはWordPressの平常運転であると知りましたが、解決方法の記載はありませんでした。
WordPressで、functions.php が複数回読まれるのは正常なのでしょうか?
WordPressにおける呼び出しの重複?
試したこと1
なので自力で解決するしかないと思い、1回しか読み込まれないテンプレートを求めて同じコードを試しにheader.phpに書いてみたところ、3回ではなく2回になりました。(1回しか読み込まれないテンプレートはないのでしょうか?)
php
1// header.php 2wp_insert_post( [ 'post_title'=>'a', 'post_content'=>'b' ] ); 3 4error_log('この文はサイト読み込みにおいて2回表示されてしまう');
試したこと2
さらに思いついた方法は、次のグローバル変数でフラグを立てる方法(フラグがfalseの場合だけ実行し、1回実行したらtrueに変更する方法)ですが、これも2回実行されてしまいました。
php
1// functioins.php 2$is_processed = false;
php
1// header.php 2global $is_processed; 3if( $is_processed === false ){ 4 wp_insert_post( [ 'post_title'=>'a', 'post_content'=>'b' ] ); 5 6 $is_processed = true; // wp_insert_postは1回しか実行しないでほしい → 効果なし 7 8 error_log('$is_processedのフラグは効果なく、この文はサイト読み込みにおいて2回表示されてしまう'); 9}
試したこと3
さらにrequire_onceも試しましたがやはり2回実行されました…
php
1// header.php 2require_once('insert.php'); // wp_insert_postは1回しか実行しないでほしい → 効果なし
php
1// insert.php 2wp_insert_post( [ 'post_title'=>'a', 'post_content'=>'b' ] ); 3 4error_log('require_onceは効果なく、この文はサイト読み込みにおいて2回表示されてしまう');
目を背けたくなるほど面倒な解決策
これは絶対にやりたくないのですが、functions.phpで以下を実行し、フロントでXMLHttpRequestを投げてis_processedをfalseに戻す。という方法ならなんとか解決はできますが、ここまで面倒なことをしなければならないでしょうか???
php
1// functioins.php 2add_action( 'init', 'once_process' ); 3function once_process() { 4 5 if( get_option('is_processed') === false ){ 6 7 wp_insert_post( [ 'post_title'=>'a', 'post_content'=>'b' ] ); 8 9 update_option( 'is_processed', true ); 10 11 error_log('is_processedは効果あり、この文はサイト読み込みにおいて1回だけの表示となる'); 12 } 13 14}
追記_2022/02/26 22:45
functions.phpが3回、header.phpが2回、という違いについてですが、これは私が別途AJAXを実行しているためでした。この処理をなくしたらfunctions.phpも2回になりました。tabuuさんありがとうございます。
質問内容には特に変わりございません。

回答2件
あなたの回答
tips
プレビュー