質問するログイン新規登録
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

2762閲覧

WordPressで何度も関数が実行されてしまいます

ringorin

総合スコア40

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2022/02/26 05:26

編集2022/02/26 11:44

0

0

前提・実現したいこと

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さんありがとうございます。
質問内容には特に変わりございません。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2022/02/26 06:09

あなたのいう解決とはどういうものでしょうか
ringorin

2022/02/26 06:15

テーマ内ファイルに書いた関数を、1回しか実行させないことです
tabuu

2022/02/26 08:26

3回アクセスしても実行するのは1回のみ、ということですか?
ringorin

2022/02/26 09:12

いいえ、1回のアクセスで実行を1回のみ、です。 現在は1回のアクセスで、functions.phpに書いたら3回、header.phpに書いたら2回実行されてしまいます。 ちなみに「アクセス」は「ページを開くとき」という意味で理解しています。 具体的には「URLバーにサイトURLを入力し、ページを開くとき」に1回だけ実行。 または「iframeのsrcからサイトが呼ばれとき」に1回だけ実行。 という意味です。
tabuu

2022/02/26 09:44

リダイレクトやAjax等もアクセスとみなされますが問題ないですか?
ringorin

2022/02/26 09:49

はい、そこは問題ございません。すみません、少し情報不足でしたね。
tabuu

2022/02/26 11:10

>例えばwp_insert_postをfunctions.phpに書くと、なぜか3回実行され、3件のレコードがINSERTされてしまいます。 Webブラウザでアクセスすると合計3回リクエストが送信されているのではないでしょうか? Chromeの開発者ツールのネットワークタブで通信内容をご確認ください。
ringorin

2022/02/26 11:33

ネットワークタブで通信内容を見ても理解ができないのですが汗、きっとそれはないと思います。理由は2つあります。 まずfunctions.phpが3回なのに、header.phpが2回だからです。もしブラウザからのアクセスで3回のリクエストがあるなら、header.phpが1回少ない(functions.phpだけを読む処理がある)というのはやや不自然に感じませんか? 2つ目は当質問で引用した「WordPressで、functions.php が複数回読まれるのは正常なのでしょうか?」で、「WPにおいてはページを表示するのにcronやらajaxやらでWPは何度も呼ばれます」というご回答があるからです。
ringorin

2022/02/26 11:40

あっ…、そういえば、訪問時にAJAXで人気記事だけを取得する処理を書いていました。これがfunctions.phpが3回実行された理由でした。この処理を削除したら2回になりました。なのでさきほどの返信で申し上げた1つ目の理由は撤回させて頂きます。ご指摘ありがとうございます。まぁそれでも2回なので質問内容は変わらずではございますが
tabuu

2022/02/26 11:44

>まずfunctions.phpが3回なのに、header.phpが2回だからです。 header.phpは呼び出されないケースはあります。 例えばajax、例えばfunctions.phpでリダイレクト。 >「WPにおいてはページを表示するのにcronやらajaxやらでWPは何度も呼ばれます」というご回答 はい、その通りです。 なので先にリダイレクトやAjax等もアクセスとみなされるが問題ないか確認しました。 まとめると、 1アクセスにつきfunctions.phpが呼び出されるのは1回です。 1アクセスと認識していても実際は複数回WordPressへのアクセスが発生しています。
ringorin

2022/02/26 11:55

ありがとうございます。私がコメント連投したせいですれ違ってしまいましたが、その点はすでに返信したように、3回と2回の違いは仰る通りでした。しかしやはり2回なのはどうも…不思議です。他にAJAXはないのですが…でも >1アクセスにつきfunctions.phpが呼び出されるのは1回です なのですね。やはり私がAJAXを書いている以外ありえませんね(リダイレクト処理はいままでの人生で書いたことがないので)。もう少し見直してみます。
ringorin

2022/02/26 12:40

うわぁ、見つけました。画像のsrcでした…↓ const logo= `<img src="http://www.example.com/wp-content/images/logo.png">` $('header').html(logo); これをなくしたら1回になりました。まさかこんなものでもfunctions.phpが呼ばれていたとは、まったく想定していませんでした。きっぱりと「1アクセスにつき1回」と仰ってくれたおかげで見つけることができました。朝からずっと苦労してましたw本当にありがとうございます。 他にも意外な呼ばれ方してそうですね。どういうときにfunctions.phpが呼ばれるのか、どこかにまとまっていませんでしょうか。知っておきたいです。
guest

回答2

0

自己解決

tabuuさんの以下のコメントの通りでした。
調べてみるとajaxがあり、このせいで1回多かったようです。

Webブラウザでアクセスすると合計3回リクエストが送信されているのではないでしょうか?

さらにKazuhiroHatanoさんの以下のコメントの通りでした。
調べてみると画像のリンク切れが1件あり、このせいで1回多かったようです。

リクエストがWordPressで処理されるのは、
URLに対応するファイルやディレクトリが存在しない場合です

以上2つの原因が判明してよかったです。
皆様どうもありがとうございました。

投稿2022/02/28 09:25

ringorin

総合スコア40

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

PHP

1add_action( 'wp', function(){ 2 if( !is_admin() ) { 3 wp_insert_post( [ 'post_title'=>'a', 'post_content'=>'b' ] ); 4 } 5} );

とでもしときゃいいんでねぇの

投稿2022/02/26 11:38

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ringorin

2022/02/26 11:46

そちらも2回実行されてしまいました。Space-Monkeyさんの方では1回だけしか実行されませんでしたか?
退会済みユーザー

退会済みユーザー

2022/02/26 13:22

そうっすね
ringorin

2022/02/26 14:07

原因がわかりました。次の記述のせいでfunctions.phpが1回余分に呼ばれていたみたいです。これを削除したら普通に1回だけの実行になりました。 const logo = `<img src="http://www.example.com/wp-content/images/logo.png">` $('header').html(logo); 画像を呼ぶだけでfunctions.phpまで呼ばれるだなんて、普通考えません…苦笑
KazuhiroHatano

2022/02/28 08:11

リクエストがWordPressで処理されるのは、 URLに対応するファイルやディレクトリが存在しない場合です wp-content/imagesというディレクトリは通常存在しないディレクトリです とりあえず画像がリンク切れではないか、 画像のURLを書き換えるプラグインとかがいないか確認してみてください
ringorin

2022/02/28 09:20

仰る通り画像がリンク切れでした。原因が判明してよかったです。どうもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.29%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問