状況と経緯
運営中のWordPressサイト全体をSSL化したところ、テーマ内で使用しているURLを出力する類の関数が種類によって「http://~~」「https://~~」という異なる出力結果になってしまい困っています。
SSL化前の状況とSSLに際して行った手順は以下になります。
【SSL化前の状況】
・WordPress + WelcartによるECサイト
・WordPress本体は /wp/ に設置。公開はドメイン直下。
・オリジナル開発テーマ、SSLを導入する前は問題は無い状態
・WordPress本体バージョンは最新、サーバーのPHPは5.6系、mySQLは5.5。
【SSL化】
・XserverにてIPアドレスベースの独自ドメインを申し込み → サーバー側の対応完了
・WordPress管理画面 > 一般設定 にてWordPressアドレス/サイトアドレスを「https://~」に変更
・Welcart > システム設定にて SSLを使用する/WordPressのアドレス/ブログのアドレス を変更
このようにしてSSL化した結果、サイトの現状は以下のようになっています。
・<?php the_permalink(); ?>
で出力されるURLが「http://~」(SSL化されていないこと以外は正常)
・<?php echo home_url(); ?>
で出力されるURLが「http://~」(SSL化されていないこと以外は正常)
・試しに<?php home_url(); ?>
にしたところ、多くの場合はSSL化された正しいURLが出力される
・上記の補足として、aタグ内href要素に<?php home_url(); ?>
のみが存在する場合は、現在表示中のページURLが出力される(最後に別途説明を追加します)
・<?php echo get_stylesheet_directory_uri(); ?>
など、他にテーマ内で使用されているURLを出力する関数は全て正常
このような状況のため、正しい表記ではないと思いますが<?php echo home_url(); ?>
を<?php home_url(); ?>
に差し替えるか、一部は直接URLを入力して対応しています。
サイトトップや固定ページへのリンクは上記の方法で対応できたのですが、個別投稿へのリンクには<?php the_permalink(); ?>
を使うしか方法を知らずに困っています。
質問
<?php echo home_url(); ?>
および<?php the_permalink(); ?>
がSSL化されたURLを出力してくれない原因と対処方法をご存知の方がいらっしゃいましたら、お力を貸していただけないでしょうか?
すでに公開中のサイトですので、根本原因の排除よりも、現在起きているエラーへの処置を優先したいと思っています。
そのため、例えばfunctions.phpに記述することでhome_url()
とthe_permalink()
が出力する値を強制的にhttpsにしてしまう、などの対処方法がありましたら、是非ご教授ください。
よろしくお願いいたします。
補足
<?php home_url(); ?>
という記述をした時の挙動は以下のようになります。
<a href="<?php home_url(); ?>/blog/">
→ https://example.com/blog/
<a href="<?php home_url(); ?>/2016/03/03/post1/">
→ https://example.com/2016/03/03/post1/
<a href="<?php home_url(); ?>">
→ 現在表示中ページのURL(http
の箇所も現在表示中のURLに依る)
追記:chitokuさんにご指摘頂いた通り、上記の説明は私は勘違いでした。
補足2
頂いたご回答にて$_SERVER
が必要とのことですが、以下のような情報でよろしいでしょうか?
(私自身で所有しているサイトではないのでドメインなどは伏せ字(xxxxx)にしています。)
PHP_SELF /index.php
argv -
argc -
GATEWAY_INTERFACE CGI/1.1
SERVER_ADDR xxxxxxx
SERVER_NAME xxxxxxx
SERVER_SOFTWARE Apache
SERVER_PROTOCOL HTTP/1.1
REQUEST_METHOD GET
REQUEST_TIME 1457028756
REQUEST_TIME_FLOAT 1457028756.7541
QUERY_STRING
DOCUMENT_ROOT /home/xxxx/xxxx/public_html
HTTP_ACCEPT text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
HTTP_ACCEPT_CHARSET -
HTTP_ACCEPT_ENCODING gzip, deflate, sdch
HTTP_ACCEPT_LANGUAGE ja,en-US;q=0.8,en;q=0.6
HTTP_CONNECTION close
HTTP_HOST xxxxxxx
HTTP_REFERER -
HTTP_USER_AGENT Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36
HTTPS on
REMOTE_ADDR xxxxxxx
REMOTE_HOST -
REMOTE_PORT 25587
REMOTE_USER -
REDIRECT_REMOTE_USER -
SCRIPT_FILENAME /home/xxxxx/xxxxx/public_html/index.php
SERVER_ADMIN xxxxxxx
SERVER_PORT 443
SERVER_SIGNATURE
PATH_TRANSLATED -
SCRIPT_NAME /index.php
REQUEST_URI /hoge/
PHP_AUTH_DIGEST -
PHP_AUTH_USER -
PHP_AUTH_PW -
AUTH_TYPE -
PATH_INFO -
ORIG_PATH_INFO -
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+2
お、ということは home_url
に対して何らかのフックが登録されていて、home_url
関数が呼ばれた時に何らかのプラグインがその結果に加工を行っているということです。(フックが登録されていない場合は長い出力ではなく NULL
が表示されます)
ここからは原因究明が大変そうですね……。plugins
ディレクトリに対して add_filter( 'home_url'
している部分を検索してプラグインを特定するしかないかと思います。あるいはテーマの functions.php
に似たような記述がないか探してみてください。
あまり有力な手がかりがアドバイスできずすみません…。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
管理画面 Welcart > システム設定 にて、「SSLを使用する」のチェックを外すとthe_permalinkおよびhome_url関数で出力されるURLがSSL化されました。
調べたところ、Welcartではサイト全体をSSL化する際は「SSLを使用する」のチェックを外さないといけないようです。
たくさんのアドバイスを頂き原因を絞り込んでいくことで、このチェックを外すところまで辿りつけました。ご回答頂いた方へ御礼を申し上げます。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
home_url
関数は文字列を出力しません。
補足のような挙動、ブラウザーでクリックするなどして確認していませんか?
実際の出力を見ると <a href="/blog/">
になっていて、結果的に望ましい挙動だったのではないでしょうか。
プロキシなどで SSL だとサーバーが正しく認識できない状況などではありませんか?($_SERVER
を補足してください)
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
$_SERVER
の値を見る限りは正しく PHP 側で SSL が認識できているようですね…。
WordPress の is_ssl()
関数の結果もあわせて確認してみてください。
ダメならこれと戦うより素直に次のようにスキームを指定して書いたほうが精神衛生上楽かもしれません。
<?php echo home_url(null, 'https'); ?>
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
それは不思議な挙動ですね……。WordPress のソースコードを確認したところ、スキームを指定しない場合でも is_ssl()
が true
を返す場合は https
になるようです。
参照:WordPress/link-template.php
is_admin()
が true
の場合(管理画面)ではないとすれば、あとは home_url
に対してフックが設定されていてそれが悪さしているように思います。
以下のようなコードでフックが登録されていないか確認してみてください。
<?php
function check_filter($tag) {
global $wp_filter;
return $wp_filter[$tag] ?: null;
}
var_dump(check_filter('home_url'));
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.09%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/03/05 03:46
問題のサイトはWordPressのインストールからテーマの制作まで全て私が行いましたので、functions.phpは原因ではないと思っています。また私はフックやフィルタといったレベルまで到達していませんので、高度な処理をしようとして記述ミスをしているわけでもなさそうです。
home_urlは直接URLを記述すれば解決ですが、the_permalinkの代替が思い浮かばないので、もう少し探ってみます!
2016/03/05 03:56
なんとかここまでたどり着きました。ありがとうございました。
welcart関連のエラー報告など、ネット上で調べてみます。