WordPressメモ

WordPressメモ

値を表示する関数と戻り値を返す関数

wordpressの関数には2種類ある。値を表示する関数と戻り値を返す関数。たとえばthe_title関数は値を表示するので以下のように使う。echoする必要はない。

echoする必要がないのは、the_title関数の定義のなかでechoしているから。wp-includes/post-template.phpをみると

という箇所を確認できる。

一方、get_the_title関数は戻り値を返す関数。関数の定義をみるとechoしていない。表示するには戻り値をechoする必要がある。

また、the_title関数はデフォルトでは値を表示するが、オプションを指定($echo=TRUE)して戻り値として受け取ることもできる。

ローカルで動かすとき

    • PHPのビルトインサーバーを起動
      • php -S localhost:8000
    • mysql80というサービスを起動
      • 起動:net start mysql80
      • 停止:net stop mysql80
      • 状態確認:sc query mysql80
    • コマンドプロンプトからmysqlに1回入る
      • なぜかわからないが1回入らないと「データベース接続確立エラー」になる
      • コマンドは「mysql -u root -p

データベース接続確立エラーになる場合

原因不明のデータベース接続確立エラーに悩まされていた。まずはwp-config.phpで

すると以下のようなメッセージが現れた。

ググってこのページにたどり着いた。

どうやらmysqlの現行バージョンではデフォルトの認証方式が新しくなり、PHP側がそれに対応していないのが問題らしい。対策としてはmysqlの認証方式を古いものに変更する。

こんなことが原因だったとは!安定してエラーが出ることはなくなった。

しかし解せないのは、いちどコマンドプロンプトから入るとエラーにならなかった点なんだよな。認証方式が違うのに接続に成功していた。謎だ…。

特定までに時間がかかった理由

最初からデータベースが怪しいという方針なら、わりとすぐに問題解決できたはず。しかしWebサーバーも怪しいと思ってしまったことで解決が遅れてしまった。

PHPのビルトインサーバーだと、記事を新規投稿するとサーバーが落ちてしまうのだ。これは面倒だということで、apacheを使うことにした。するとapacheでPHPを動かすにはモジュール(php7apache2_4.dll)が必要だったんだが、これが見当たらない。あとからわかったのが、PHPにはThread safeとNon Thread safeがあること。昔々俺がダウンロードしたのはいちばん上にあるNon~のほうだったのだが、くだんのモジュールはThread safeにしか入っていない。

ということでPHPを入れなおしてPATHも書き換えてと。あとapacheのドキュメントルートを変更したり、ポート番号も変更したり。

同時にいろいろやりすぎたせいで、怪しい対象が広くなりすぎてしまったorz

追記

「PHPのビルトインサーバーだと、記事を新規投稿するとサーバーが落ちてしまうのだ」と書いたが、現象を再現しようとapache→ビルトインサーバーに変えて新規投稿しても落ちない。原因はビルトインサーバーではなく認証方式が違ったからみたいだ。解せないのは認証方式が違うのに投稿できて、そのあとビルトインサーバーが落ちていたことだ。闇が深い…。

「投稿できて、そのあとビルトインサーバーが落ちる」を再現しようと認証方式を新しいものに戻して投稿してみた。やはり投稿できて(データベースにインサートできて)、しかしこんどはビルトインサーバーは落ちず、データベース接続確立エラーになった。

ようわからんが、たしかなことは認証方式が違っていても投稿できてしまうということ。認証方式自体をお勉強すればこの現象を理解できそうだが、今回はこれ以上深追いしないことにする。

謎の の連続が出現する件

「wordpress  」でググって見つけたこちらのページによると、2連スペースが に変換されてしまうらしい。
たしかに該当箇所にはスペースの連続があった。しかし が現れないほかの場所にもいたるところにスペースの連続がある。たぶんこれが原因じゃないよなぁ、と思いつつ の連続が出現する箇所のスペースをTABに置き換えてみた。 消えた。一件落着。だけど、ほかにも2連スペースがいたるところにあるけど 出てないよ?なんだこれ。
とはいえWordpressで謎の の連続が現れたら、とりあえず当該箇所のスペースをTABに置き換えてみると解決するかもしれない。

wordpressの編集画面でペーストするとスクロールバーがずれてうざい件

コピペするたび視点がずれて不便極まりない。検索しても思うような記事がヒットせず。いまだ解決できず。
→思案のち、コピペといえば「Image Elevator」怪しいなということで停止してみた。ずれなくなった。Image Elevator超便利なんだけどね。。。なんか設定すれば回避できるかもしれない。

いまのところのざっくりとした理解

wordpressは3つの部分からなっているっぽい。

  • wordpressコア
    • bloginfo()やthe_title()などのテンプレートタグを提供する
    • ブログ情報などを保持してる
  • テーマ
    • wp_head()やwp_footer()などのフックを実際にかけたのはテーマ製作者
  • ユーザーが手を加えた部分
    • テーマ製作者がおいたフックを子テーマのfunctions.phpから使う(テーマ製作者自身も親テーマのfunctions.phpから使う)

正直複雑すぎて全部は把握できそうにない。しかし結局最後はHTMLを吐くということを念頭にコードを追いかければ、完璧には理解できなくてもトライアンドエラーでやりたいことは基本できるのかな、という感じではある。

アクションフック・フィルタフック

  • add_action():アクションフック:追記するときなど
  • add_filter():フィルタフック:変数を書き換える:書き換え後の変数を必ずreturnする
  • do_action():フックされた関数を実行する
  • apply_filters():フックされた関数を実行する:引数は基本Codexで調べるが、載ってなかったらソースを探すとわかる

以下はwp-login.php内でapply_filters関数を呼んでいる部分の一例。

login_body_classにフックすることで$classesを成形することができるんだと思う。$actionは成形できないのかな?渡しているのが参照ならできるのかも。
do_action関数とかapply_filters関数を自分で呼べば、自分でつくったフックを設置できる。実際できた(勉強のために実験する以外で設置することはないだろうけど)。
wp_head()とかwp_footer()とかがテーマから呼ばれているが、それ自体がフックなわけではない。wordpressコアの中で定義されているwp_head()/wp_footer()のなかでdo_action関数が呼ばれているはず(ちょろっと探したがソースファイルがみつからない)。

wp_headとwp_footerの中身

wp_headとwp_footerを定義しているファイルを見つけました。wp-includes/general-template.phpにあります。定義部分を抜粋します。

予想どおりdo_action関数を呼んでいました。というか、呼んでるのみかいw つまり、wp_head/wp_footerはフックを置くことのみが目的の関数だった。じつにシンプル。
ちなみにソースファイルの場所はCodexに書いてあった。すべての関数にソースファイルの項目が用意されているっぽい。親切。

フィルタフックにひっかけるときは必ずreturnする

wordpressコアのソースでは基本この形で書かれているみたい。

なので、functions.phpでフィルタフックにひっかける際、returnを返さないとフィルタ処理が反映されない。return必須(アクションフックにひっかけるときは必要なし)。

いまのところのざっくりとした理解2

functions.php

functions.phpに書く処理は、かならず関数で囲みフックにひっかける(登録する)必要がある。

フックにひっかけないとすると、どこにどのタイミングで実行するか決めないことになる。そのような処理はない。functions.phpに処理を書く目的はPHPが吐くHTMLのどこかをいじることなのだ。

ゆえにかならずadd_action/add_filterでフックにひっかける必要がある。

フックの種類

フックには主に2種類ある。Wordpressコア内に置かれたフックと、テーマ製作者が置いたフック。

さらにテーマ製作者が置いたフックのなかでも、Wordpressに置くことを要求されているフックがある。wp_headやwp_footerなどだ。これらはフックを置くための関数がWordpressコア内に用意されている。wp_head()関数やwp_footer()関数など。上述したように中身はフックを置くだけ(add_action関数を呼ぶだけ)になっている。

テーマ利用者の俺は、基本的にfunctions.php内に処理を書くのみ。テーマにはできるだけ手は入れない。どうしてもテーマに手を入れたい場合、親テーマのファイルを子テーマにコピーしてきていじることになる。

また、Wordpressコアに手を入れることは絶対にないだろう。テーマ製作者ですらWordpressコアには手を入れることはないのだから。なぜならテーマ利用者はテーマとWordpressをべつべつにインストールするわけだから。

あきらかにバグないはずなのにエラーが出るとき

周辺のスペースが悪さしてるパターンけっこうある。タブに置き換えるとエラーがとれるパターンありがち。

ローカル環境

PHPのビルトインサーバーでローカルのWordpressにアクセスする場合、ポート番号8000番でないとなぜかアクセスできない。

8080番とかで起動して8080番にアクセスするとなぜか8000番にリダイレクトされてエラーになる。たまにアクセスできるけどなぜかCSSがあたっていない。なんだろうこれは。

たぶんWordpressのなかのファイルのどれかで8000番を指定してるんじゃないかと思う。8000でfindstrしてみたらclass-wp-http-cookie.phpにて以下のコメントが見つかった。

80、8000、8080しかサポートしていないのか?しかしサーバーを8080で起動してもだめじゃん。なぞだ。8000で起動すれば問題ないので、とりあえずいまは放置。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする