サイトをhttps化した後に、混在コンテンツ(httpの暗号化されていないファイルが読み込まれてしまう)の解決をするのが難しい場合があります。
混在コンテンツはブラウザーによってはファイルを読み込むのを停止してしまう場合があり、jqueryなどの重要なプログラムが読み込まれないと最悪サイトの表示が壊れたり、フォームが送信できないなどの問題が起こる場合があります。
今回は、混在コンテンツの解決方法、特にwp_head()が出力するhttpのコンテンツについて解決する方法を解説いたします。
wp_head()とは?
wp_head()は、多くの場合テーマに含まれるsingle.phpやpage.phpの単投稿、単ページを表示するプログラムに含まれている関数です。この関数を使用すると前頁共通で出力されるヘッダーのHTMLを表示することができます。
さて、https化したサイトでこのwp_head()が、混在コンテンツを出力してしまっていたらかなり厄介です。なぜなら、この関数がどこから何を引っ張ってきて出力しているかがテーマや本体プログラムと複雑に絡んでいるため、その場所を特定することが難しくなっているからです。
wp_head()が出力する、バッファをその場で書き換えることで解決する
ob_start(); wp_head(); $wp_head_replaced = str_replace('http://', 'https://', ob_get_clean()); echo($wp_head_replaced);
全てのテンプレート中に含まれているwp_head()関数を上記で書き換えると、wp_head()が出力するhttpのコンテンツをバッファから引っ張り出してhttpsに置き換えます。
functions.phpで一括で混在コンテンツを置き換える
しかし、上記の方法の場合、テンプレートでwp_head()関数を探してすべてを置き換える必要があるため面倒ですし、漏れが出てきてしまう可能性があります。下記のコードをテーマのfunctions.phpに追記することで、一気にすべてのページでwp_head()の出力を置き換えてくれます。
add_action( 'wp_head', 'wp_head_buffer_start', 0 ); add_action( 'wp_head', 'wp_head_buffer_end', 100 ); function wp_head_filter($buffer) { return str_replace('http://', 'https://', $buffer); } function wp_head_buffer_start() { ob_start( 'wp_head_filter' ); } function wp_head_buffer_end() { ob_end_flush(); }
この方法は、wp_head()関数にフックを追加して常に関数が呼ばれるたびに実行され、その出力をバッファを置き換えてしまう方法です。
お試しください。