メモ > 技術 > CMS: WordPress > トラブル
トラブル
■意図しないデータが取れる / 意図したデータが取れない
ループが複数あると、そのような挙動になることがある。前のループの終わりで
wp_reset_postdata()
を呼び出すと解決することがある。
これを実行すると、上書きされた値をメインクエリのためのデータに戻してくれる。
WP_Queryで記事を取得したときはwp_reset_postdataとwp_reset_queryのどっちを使うのか | Freiheit channel
https://freiheit-channel.com/?p=112
サクッと複数ループのコピペと解説|WordPressの使い方
https://wpno.jp/2017/06/5892/
WordPressの「wp_reset_postdata()」は具体的にどんな時に必要になるのかについて | たくおのーと
https://takuo4649design.com/weblog/note/archives/13361
■意図した日時を取得できない
PHP標準関数の date()・time()・strtotime() で日時を取得しても、時差が発生するなど意図した値を取得できないことがある。
WordPressでは date() の代わりに date_i18n() を、time() の代わりに current_time() を使用するのが無難。
以下はコンテンツ時限公開の例。
2019-09-01 10:00:00 〜 2019-09-12 00:00:00 の間に「時限公開する内容」と表示される
<?php if (current_time('timestamp') > strtotime('2019-09-01 10:00:00') && current_time('timestamp') < strtotime('2019-09-12 00:00:00')) : ?>
<p>時限公開する内容</p>
<?php endif ?>
ワードプレスでPHPのdate出力を使うと時間が9時間ずれるのを防ぐ方法 | ワードプレスドクター
https://wp-doctor.jp/blog/2020/12/16/%E3%83%AF%E3%83%BC%E3%83%89%E3%83%97%E3%83%AC%E3%82%B9%E3%81%A7...
もう ずれない! WordPress で date を扱う正しい方法 | Design Hack and Slash
http://designhack.slashlab.net/how-to-resolve-incorrect-time-in-wordpress/
■リダイレクトループ対策
リダイレクトループが発生した場合、wp-config.php に以下を書けば何とかなることがある。
$_SERVER['HTTPS'] = 'on';
もしくは、以下のように書く方がいいか。
if (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
$_SERVER['HTTPS'] = 'on';
}
SSL対応後のWordpress管理画面で発生した無限リダイレクトループの修正方法 - Qiita
https://qiita.com/hirror/items/bb96e236c3ffc41e890e
「require_once(ABSPATH . 'wp-settings.php');」より後に書くと「このページにアクセスする権限がありません。」と言われ、
管理ページにログインできなくなるので注意。
WordPress + HTTPS + リバースプロキシ = このページにアクセスする権限がありません。 - yohgaki's blog
https://blog.ohgaki.net/wordpress-https-reverse-proxy-sorry-you-are-not-allowed-to-access-this-page
AWSのELB配下でHTTPSリダイレクトさせる場合、以下が参考になる。
ELB配下のApacheで外部はHTTPSにリダイレクトし、内部のサーバのみHTTPで通信させる - Qiita
https://qiita.com/wapa5pow/items/a5c4fc188e5da0ddde1d
AWS EC2で常時SSLを実現する際の注意点 - Qiita
https://qiita.com/michimani/items/88973c5e2ae76a8e84aa
WordPressのSSL対応は、以下の記事も参考になりそう。
「FORCE_SSL_ADMIN を使えば簡単にかつ強制的にできる」というだけで、これを使わずにサイトのURLを設定しても大丈夫かも。(未検証。)
管理画面での SSL 通信 - WordPress Codex 日本語版
http://wpdocs.osdn.jp/%E7%AE%A1%E7%90%86%E7%94%BB%E9%9D%A2%E3%81%A7%E3%81%AE_SSL_%E9%80%9A%E4%BF%A1
define('FORCE_SSL_ADMIN', true);
もしくは
define('FORCE_SSL_ADMIN', true);
if ( ! empty( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' ) {
$_SERVER['HTTPS']='on';
}
と設定することで対応できるみたい。
■ページ送りができない
※アーカイブページで404エラーになる場合。
※未検証。
アーカイブテンプレートでquery_postsを使ったらページ送りで嵌った!という話。 - Toro_Unit
https://torounit.com/blog/2013/02/14/1470/
[Wordpress]pre_get_postsを使いこなす!pre_get_posts使い方まとめ | EMiAC-Works
http://emiac-works.com/coding/pre-get-posts-code-snipet/
Top Level Categories Fixプラグイン | WordPressで企業ウェブサイト作成・商用ホームページ制作 WordPress Go Go
http://wpgogo.com/development/top-level-cats-fix.html
■管理画面以外で英語表記になる
※無理矢理な対応なので非推奨。
何故か「本番環境でのみ日本語表記にならない」ということがあったので調査。
/wp-includes/l10n.php の560行目あたりを以下のようにすると日本語表記になった。でも他への影響が不明。
プラグインの設定が悪さをしているみたい?
558: if ( true == $plugin_override ) {
559: // unset( $l10n_unloaded[ $domain ] );
560:
561: // return true;
562: }
「設置した翻訳ファイルの読み込みを無効にする」という処理のコメントアウトなので、問題ない…はず。
何かキャッシュの設定が悪さをしているとか?不明。
以下に該当箇所のコード解説がある。参考までに。
WordPress 英語サイト作成時に翻訳ファイルが読み込めない
https://tadtadya.com/wordpress-i-can-not-read-a-translation-file-when-creating-an-english-site/
■管理画面からテーマファイルを編集できない
管理画面の「外観 → テーマの編集」からテーマを編集できるが、編集時にWordPressのバージョンによっては。
「致命的なエラーをチェックするためにサイトと通信できないため、PHP の変更は取り消されました。」
というエラーが表示される。
WordPress4.9からテーマ編集の入力チェックが厳しくなっており、実質この機能は使えないみたい。
FTP経由で更新することが推奨される。
【対処法】WordPress4.9でテーマの編集がエラーでできない時
https://nomadicwood.com/archives/5802
どうしても管理画面から編集したい場合、本体プログラムを調整することで対応できる。
/wp-admin/includes/file.php の492行目から599行目。
以下の部分を丸ごとコメントアウトすると入力チェックを外すことができる。
492: if ( $is_active && 'php' === $extension ) {
493:
494: $scrape_key = md5( rand() );
495: $transient = 'scrape_key_' . $scrape_key;
496: $scrape_nonce = strval( rand() );
497: set_transient( $transient, $scrape_nonce, 60 ); // It shouldn't take more than 60 seconds to make the two loopback requests.
〜略〜
597: return new WP_Error( 'php_error', $message, $result );
598: }
599: }
【エラー修正】致命的なエラーをチェックするためにサイトと通信できないため、PHPの変更は取り消されました。
https://take-it-easy.tokyo/miscellaneous-notes/wordpress/correct_fatal_error
■古いjQueryが読み込まれる
古いjQueryが自動で読み込まれてしまい、それが原因でJavaScriptが動かないことがあった。
HTMLを確認すると、以下のように読み込まれていた。
<script type='text/javascript' src='/wp-includes/js/jquery/jquery.js?ver=1.12.4'></script>
<script type='text/javascript' src='/wp-includes/js/jquery/jquery-migrate.min.js?ver=1.4.1'></script>
以下を参考に対応
WordPressでjqueryとjquery-migrateの2つの読み込みを解除する方法 | Musible
https://musible.net/web/wp-jquery-unload.html
具体的には、functions.php に以下のコードを追加した。
(問い合わせページで発生した問題だったので、URLに「contact」が含まれる場合のみの対応とした。)
function my_scripts_method() {
wp_deregister_script('jquery');
}
if (preg_match('/^\/contact\//', $_SERVER['REQUEST_URI'])) {
add_action( 'wp_enqueue_scripts', 'my_scripts_method' );
}
■サーバ負荷が急激に上がることがある
※未検証。
WordPressのCron処理を無効にしてみると改善することがあるらしい。
WordPressで定期的に処理をさせる!WP-Cronの設定方法 - 東京のホームページ制作 / WEB制作会社 BRISK
https://b-risk.jp/blog/2017/09/wp_cron/
WordPress の wp-cron を無効にしたら劇的にパフォーマンスが改善した話 | あぱーブログ
https://blog.apar.jp/web/7430/
wp-cron.phpを無効化して高速化される理由 | ハックノート
https://hacknote.jp/archives/37075/
■メンテナンスモードが終了しない
WordPressのどの画面にアクセスしても「現在メンテナンス中のため、しばらくの間ご利用いただけません」と表示され続ける場合の対応。
以下にあるように .maintenance を削除すればアクセスできるようになるが、更新が本当に完了しているのかは不明のような。
「現在メンテナンス中のため、しばらくの間ご利用いただけません」が表示された時の対処法 | てらこや.work
https://www.terakoya.work/wordpress-maintenance-howto/