プラウザでのソース表示が変?
-
お世話になります。
プラウザでのソース表示が変?なので、質問させて頂きます。
最近気付いたのですが、プラウザでwordpressのサイトのソースを表示してみると、投稿した記事本文の部分のみ、このように表示されてしまいます。
最近までは問題なく、日本語とタグの構成で表視されていたのですが・・・
↓
‘<p>&#12354;&#12394;&#12383;&#12399;&#12289;<span class=”black”>&#12491;&#12461;&#12499;&#12398;&#27096;&#12293;&#12394;&#31278;&#39006;&#12398;&#30149;&#21517;</span>&#12434;&#12372;&#23384;&#30693;&#12391;&#12375;&#12423;&#12358;&#12363;&#65311;&#31169;&#12399;&#12289;&#25968;&#24180; ’
なんか、機械語?みたいな感じです。
ちなみに、他の手持ちのサイトは通常通りこのように表示されるのですが、
↓
<p>定通が藩主であったのは、文化6年(1809年)7月から~天保6年(1835年)6月までの27年間ですが、その頃、松山藩の財政は窮地にあったのでした。その大きな原因となったのは、作物の凶荒の連続です。当時はその発生頻度が多く、松山藩は立ち行かなくなっていたのです。</p>
<p>記録によれば、作物の凶荒は、・・・・・サイトがウィルスかなにかにやられたのか、それとも、
なにかの設定が悪いのか???が、見当がつきません。ただ、サイトの方は、何の問題もなく表示されています。
リンクなどの動きを含めて、問題なしの状態です。もし、原因にお心当たりのあるかたがいらっしゃいましたら、
お知恵をお借りしたいのですが、よろしくお願いいたします。
-
nobitaさんへ、
気付きを頂き、有難うございます。
<?php the_content(); ?>
の部分を以下のようにして、表示してみましたが、
<?php $content =the_content(); echo mb_convert_encoding($content, 'HTML-ENTITIES', 'auto')."\n\n"; ?>
やはり、表示は、問題なくきれいに出来ているのですが、
その本文のソースコードのみ、やはり、まだ、実体参照での表示です。いったいどのような、
「テーマが、データを最終的に出力するときに使われるエスケープ関数」的なものが、適用されているのでしょうか???
ただ、いろいろ考えても、
いろいろなプラグインを入れたくらいしか思いあたらないのですが、
やはり、使用するプラグインが多すぎるんでしょうか・・・?ちなみに、こんなに入れてしまっています。
1-Akismetを選択
2-AntiVirusを選択
3-Category Orderを選択
4-CM Tooltip Glossaryを選択
5-Contact Form 7を選択
6-Crazy Bone (狂骨)を選択
7-CSV Importerを選択
8-Custom Post Templatesを選択
9-Delete-Revisionを選択
10-Disqus Comment Systemを選択・・・停止中
11-Duplicate Postを選択
12-Exec-PHPを選択
13-FancyBox for WordPressを選択
14-Google Analyticatorを選択
15-Google XML Sitemapを選択
16-Hello Dollyを選択・・・停止中
17-Login LockDownを選択
18-Pretty Link Liteを選択
19-PS Auto Sitemapを選択
20-PS Disable Auto Formattingを選択
21-Resize At Upload Plusを選択
22-Revision Controlを選択
23-ShowID for Post/Page/Category/Tag/Commentを選択
24-Twitter Widget Proを選択
25-Wordbookerを選択
26-WP Multibyte Patchを選択
27-WP No Category Baseを選択
28-WP Social Bookmarking Lightを選択
29-WP Super Cacheを選択
30-WP to Twitterを選択多すぎでしょうか??
kjmtshさんへ、
いろいろとご指導を頂き、
有難うございます。ちょっと、ご意見をお聴きしたい事があります。
当然ですが、突き詰めて、何とか原因はつかもうと思うのですが、
現状として、<?php the_content(); ?>
の部分を、
<?php $content = get_the_content(); //ここで本文部分に修正を加える $content = preg_replace("/\n/","<br />",$content); echo $content; ?>
と、そっくり入れ替えてしまえば、
何等か?の影響を受けず、きちんと、ソースコードが日本語で吐き出されるという事が、
判明しました。これは、
「ちなみに、the_content() は内部で get_the_content() を使い、次にフィルタを適応します。」のご意見を参考に考えた事です。
そこで、お聞きしたいのが、
現在、気に入らない、
<?php the_content(); ?>
の部分を、このように置き換えて運用した場合、
今後、何か、致命的な障害とか問題点が、発生する可能性はありますでしょうか?
もし、よろしければ、
kjmtsh様の、ご意見をお聴きしたいのですが・・・。もし、また訪問されて、
お時間でもござおましたら、ご教授いただければと思います。kjmtshさんへ、
すみません、自問自答が多くて、申し訳ないのですが、
じっくりとサイトの表示を確認してみると、
やはり、「ちなみに、the_content() は内部で get_the_content() を使い、次にフィルタを適応します。」
このフィルタがかかっていないせいか、
ショートコードが変換されていませんでした。そこで、<?php the_content(); ?>
の部分を、そっくり入れ替えて運用するのは、
選択肢から消えそうです。私がお知らせしたのは、通常の文字列を、数値文字列に変換する方法で、数値文字列を通常の表現に戻す方法ではありません。
誤解です
やはり、表示は、問題なくきれいに出来ているのですが、
その本文のソースコードのみ、やはり、まだ、実体参照での表示です。いったいどのような、
「テーマが、データを最終的に出力するときに使われるエスケープ関数」的なものが、適用されているのでしょうか???
通常の表現に戻すには、以下のようにします。
<?php $content =<<<CONTENT <p>定通が藩主であったのは、文化6年(1809年)7月から~天保6年(1835年)6月までの27年間ですが、その頃、松山藩の財政は窮地にあったのでした。その大きな原因となったのは、作物の凶荒の連続です。当時はその発生頻度が多く、松山藩は立ち行かなくなっていたのです。</p> CONTENT; $content = mb_convert_encoding($content, 'HTML-ENTITIES', 'auto'); echo $content;//実体参照 数値文字列 $content = mb_convert_encoding($content, 'UTF-8', 'HTML-ENTITIES');//数値文字列を通常の文字で表現UTF-8 echo $content; ?>
ちなみに、こんなに入れてしまっています。
根拠はありませんが、全部停止して、表示を確認すると正常に戻るんじゃないかという気がします。
ん? 待った。
私の使っているテーマでは、
テーマをデフォルトにする、というのは、デフォルトのテーマ twentyfourteen にかえることをいいます。現在使っているテーマの設定をデフォルトに戻すことではありません。
ikechan さん、申し訳ありませんが、もう一度以下を確認していただけますか?
- 全てのプラグインを停止する。一つも残しちゃだめです。WP Super Cache なんてのもあるので、ちょっと難しいのですが、とにかく全て「無効化」して試してください。
- 「私の使っているテーマ」ではなく、デフォルトのtwentyfourteenにテーマを変更してください。
なお、the_content() を別の関数に入れ替えて、フィルタを書き戻す、というのは可能ですが、これは問題の解決ではなくて、回避ですから、お勧めしません。とりあえず、今、時間がないので、上の点だけお願いします。試していただいた出力は後で見ます。
kjmtsh様、
nobita様、いろいろと、有難うございます。
原因が特定出来ました。
kjmtsh様の言われる通り、プラグインを停止する方法を、
再度、いろいろとやってみましたら、前回のチェックでは、キャッシュか何かが残っていたらしく、
時間をかけて、確認しながらやると、
今回のチェックでは、原因となっているプラグインが特定できました。それは、
4-CM Tooltip Glossary
でした。
これを無効化すると、ソースコードは正常にもどりました。また、
kjmtsh様に教えていただいた方法で、
打ち出されたコードの比較を
全行行ってみましたが、その結果、
[9998] => Array ( [CMTooltipGlossaryFrontend::cmtt_glossary_createList] => Array ( [function] => Array ( [0] => CMTooltipGlossaryFrontend [1] => cmtt_glossary_createList ) [accepted_args] => 1 ) ) [9999] => Array ( [CMTooltipGlossaryFrontend::cmtt_glossary_parse] => Array ( [function] => Array ( [0] => CMTooltipGlossaryFrontend [1] => cmtt_glossary_parse ) [accepted_args] => 1 ) ) [10000] => Array ( [CMTooltipGlossaryFrontend::cmtt_glossary_addBacklink] => Array ( [function] => Array ( [0] => CMTooltipGlossaryFrontend [1] => cmtt_glossary_addBacklink ) [accepted_args] => 1 ) )
この部分のコードが原因だと解りました。
これは、間違いなく
CM Tooltip Glossary のものです。
このプラグインを無効化すると、
この部分のコードが表示されなくなり、
ソースコードも通常のものに戻ります。単純な確認ミスで、手数をおかけいたしました。
「根拠はありませんが、全部停止して、表示を確認すると正常に戻るんじゃないかという気がします。」
と、仰せの通りでした。
ーーーーーーーーーーーーーーーーーーーーーーーーーー
★kjmtsh様の最初のご指示通り、
きちんとキャッシュの事も気にしながら、
じっくり確認していれば、最初の、その時点で、判明している原因でした。
無駄な時間を御取りしてしまったことを、
申し訳なく思います。有難うございました。
ーーーーーーーーーーーーーーーーーーーーーーーーーー
これで原因が特定できたので、
このプラグインを使わなければ、事態は解消できるのですが、どうしてもサイトに、自動で作成できる用語集がほしいため、
現状で、ほかに使えそうな用語集のプラグインも知らないので・・・。
まだ、あきらめきれずに、もがいています。それは、
<?php $content =the_content(); $content = mb_convert_encoding($content, 'UTF-8', 'HTML-ENTITIES');//数値文字列を通常の文字で表現UTF-8 echo $content; ?>
このような、nobita様の方法みたいなので、
通常表示が出来ないものかと思ったからであります。ただ、この方法では、ご指示のように、直接、
文章を入力した場合は機能するのですが、$content =the_content();
このように変数で渡した場合には機能しません。
やはり、今まで通り、
ソースコードが、
文字実体参照で吐き出されてしまします。ちょっと気になるのは、
<div class="m10-b">&#12354;&#12394;&#12383;</div> <h4>&#12354;&#12394;&#12383;</h4>
このように、
<h4>、</div>
などのタグは、きちんと表示されていて、
日本語部分のみ、&#37202;のようなコードで表示されている事なのですが・・・。いずれにしても、もう少し、もがいてみます。
まずは、お時間を御取りしてしまった事にお詫びと、
また、ご対応いただいた事に対するお礼を申し上げます。有難うございました。
今からは、mb_convert_encoding(・・・のような方法を、
いろいろ試してみようと思います。おっと、もう解決してましたね。
これで原因が特定できたので、
このプラグインを使わなければ、事態は解消できるのですが、もはや事態は解消しているのではないですか? 使うと何か不都合がありますか?
ちょっと興味が湧いたので、リポジトリを覗いてみましたが、the_content() に add_filter() しているメソッドを追っていくと、call_back メソッドの中で、
if( !$dom->loadHtml(mb_convert_encoding($html, 'HTML-ENTITIES', "UTF-8")) )
こんなことをしていました。$html の実体は、投稿の本文です。このプラグインを使う限り、今の現象は異常事態ではなくて、むしろ、作者はそれを意図して使っています。全体を読んだわけではないので、細部はわかりませんが、本文データを検索して glossary(たぶんXML) と照合し、マッチした部分に data-tooltip やリンクを付け加えているのではないでしょうか。
ここで照合に実体参照を使うのは、考えてみれば、とても合理的な選択で、文字コードや符号化、それどころか、言語さえもこえて、us-ascii のみで扱えるという利点があります。途中で変換するのは、データベースに保存された本文は再編集や検索の都合があるので、いじれないからでしょう。また、そのまま出力しても、ブラウザを通す限り、ちゃんと人間に読める形になりますから問題ありませんよね。ikechan さんにとっても、訪問者にとっても不都合はないような気がします。
ikechan さんが、人間に読める形のソースにこだわる理由はわかりませんが、そうしたいなら、cm-tooltip-glossary-frontend.php の中で cmtt_glossary_parse() メソッド(たぶんこれだけでいいと思いますが、確認できません)を探して、最後の
return $content;
を、
return mb_convert_encoding($content, 'UTF-8', 'HTML-ENTITIES');
すれば、戻るとは思いますが、お勧めはしません。他のメソッドが発狂するかもしれないし、パーサが途中で止まるかもしれないからです。試す場合は、自己責任でお願いします。
日本語部分のみ、&#37202;のようなコードで表示されている事なのですが・・・。
PHP manualで、mb_convert_encoding()、htmlspecialchars()、htmlentities() などをご覧になると、いろいろなことが発見できますよ。こちらはお勧めです。
kjmtsh様へ、
細かなところまで、ご説明頂き感謝します。特に、
「作者はそれを意図して使っています。」というのを読み取っていただいたのは、
ありがたいです。★素人の私に、高度なご対応をいただき、
本当にありがとうございます。————————————–
確かに、kjmtsh様の言われる通り、
「人間に読める形のソースにこだわる理由」・・・
が、自分でもうまく説明できませんが、こだわる理由について考えてみると、
グーグルなどの検索ロボットで、サイト内が閲覧される場合、
1・人間に読める形(日本語)の方が有利なのか
2・ロボットに理解できる文字実体参照が有利なのか
3・どちらも検索ロボットにとっては同じなのか、という判断部分で、私は、1・を選んでしまっているようです。
ここで言う「有利」という意味は、
検索ロボットが理解しやすいのか?というような意味なのですが、単に、日本語のサイトなのだから、
ロボットも、日本語で書いているだろうと予測して読みに来るから、
ソースも日本語であったほうが読み易いのではないだろうか?という、私の勝手な思い込みのせいです。
——————————————–
やはり、サイトを作る以上、上位表示を目指したく・・・
そうなると、人間の訪訪問者に対しても、また、
検索ロボットに対しても、読み易いソースコードが、
必要なんじゃないか?と勝手判断しているからです。やはり、このような発想は、素人の井の中の蛙・・・的な発想であって、
実際には、kjmtsh様の言われる通り、
「考えてみれば、とても合理的な選択で、文字コードや符号化、それどころか、言語さえもこえて、us-ascii のみで扱えるという利点があります。途中で変換するのは、データベースに保存された本文は再編集や検索の都合があるので、いじれないからでしょう。また、そのまま出力しても、ブラウザを通す限り、ちゃんと人間に読める形になりますから問題ありませんよね。ikechan さんにとっても、訪問者にとっても不都合はないような気がします。」
その上に、
「検索エンジンにとっても、不都合がない良い方」
なのでしょうか?
———————————————
PHP manual
の情報もありがとうございました。中途半端な知識しかないままに、質問させて頂きましたが、
丁寧なご対応に感謝いたします。「もはや事態は解消しているのではないですか? 使うと何か不都合がありますか?」
につきましては、
「既に事態は解消しており、使っても不都合がない状態なのですが、」あきらめの悪い田舎者なので、
もがきついでに、あと1~2日間だけ、cm-tooltip-glossary-frontend.php
などの、プラグイン内部の操作ではなく、<?php $content =the_content(); $content = mb_convert_encoding($content, 'UTF-8', 'HTML-ENTITIES'); echo $content; ?>
のようなプラグインの処理以後の操作の方法で、
日本語表記に出来る方法が無いものか???と
他に、このような自動でページ内の文から
用語集ページにリンクをはれるプラグインなどが無いかを、
探してみようと思います。kjmtsh様へ、
高度な発想や、考え方を教えていただき、ありがとうございました。
また、原因をはっきりと理解させていただき、有難うございました。
感謝いたします。しかし、
何故これが機能しないんでしょうか?使う使わないは別にしても、
これさえ機能すれば、納得できるんですけど・・・???
<?php $content =the_content(); $content = mb_convert_encoding($content, 'UTF-8', 'HTML-ENTITIES');//数値文字列を通常の文字で表現UTF-8 echo $content; ?>
う~ん???
修正:
the_contentが、エコーしているから、しょりがしょりになっていないと思います
なので、フィルタ使ってみるといいかも、(未テスト)
add_filter( 'the_content', 'my_entities', 10); function my_entities( $content ) { $content = mb_convert_encoding($content, 'UTF-8', 'HTML-ENTITIES'); return $content }
として、フィルタがかからない場合は、10を99とか、最後のほうでフィルタがかかるように調整する。
とか、remove_filterとか、試してみてはどうですか?
余談:質問とは関係ありませんが、ご利用のプラグインには、古いものも含まれているようなので、全体的に見直しするといいと思います。
PHPの実行が可能なプラグインも使っているようですが、そういったものの中には、
例えば、コンテンツ本文に記述したコードが、WordPressの検索で検索できてしまうこともありますので、セキュリティ上のリスクが発生することがありますので、よく検討してみてください。nobita様へ、
素人の私に、まだお付き合いいただき感謝いたします。
有難うございます。
まだ。いろいろ試し中なのですが、
nobita様へ、よりのご教授の中で、
不明な点がございますので、もし、また再訪されて、お時間でもあれば、お教えいただければと思います。
1.
$content =<<<CONTENT
<p>定通が藩・・・ていたのです。</p>
CONTENT;この文中の、<<< には、どのような意味があるのでしょうか?
2.
add_filter( 'the_content', 'my_entities', 10); function my_entities( $content ) { $content = mb_convert_encoding($content, 'UTF-8', 'HTML-ENTITIES'); return $content }
このコードは、どこに記載すればよろしいのでしょうか?
(直接、single.phpに張り付けると、画面が真っ白になりました。)いずれも、すごく初歩的な質問と思いますが、よろしくお願いいたします。
1.について
http://www.php.net/manual/ja/language.types.string.php#language.types.string.syntax.heredoc
2.について
functions.phpに記述します。
画面が真っ白になりました。
http://gihyo.jp/design/serial/01/wpress2010/0002
この機会に覚えておくと、何かとお得だと思います
あーっと、
nobita さん、これがですねぇ、もとのメソッドは、プライオリティが 9998-10000 にしてあるんですよ。99 では足りませんです。
ikechan さん、
add_filter( 'the_content', 'my_entities', 20000);
くらいにしといてください。
以下、雑談です。
検索ロボットが理解しやすいのか?
さあ、どうでしょうねぇ? Google の論文、たくさんあってすごく役立つけど、こういう処理についてはちゃんとしたドキュメントがないので、わかりません。都市伝説はたくさんありますけどね。
<html lang="ja">
となっていて、ヘッダやタイトルは普通の日本語で、本文だけは文字参照だというのは、一般的でないことは確かでしょうね。文字数のカウントは間違いなく原文とは違うことになると思いますし…CM Tooltip Glossary のサポートフォーラムを見てたら、ペルシャ語の方、キリル語の方、latin-1の方、それぞれが、ちゃんと表示されないよって、バグリポートしてました。こういった言語に対応するために、現在の仕様になったんでしょう。面白いと思ったけど、確信をもってやっているというより、苦肉の策だったのですね。
ikechan さん、気に入ったプラグインなら、フォーラムで、「協力するから、ちゃんとローカライズ対応やる気ない?」ってポストしてみたらどうでしょう? 少し協力すると、「じゃぁ、プロバージョンのライセンス送るよ」みたいに言ってくれる人が多いですよ。
nobita様、
kjmtsh様、長い間、お付き合いいただき、ありがとうございました。
add_filter( 'the_content', 'my_entities', 20000); function my_entities( $content ) { $content = mb_convert_encoding($content, 'UTF-8', 'HTML-ENTITIES'); return $content; }
で、無事、問題は解消いたしました。
初心者の私にもかかえわらず、
お二人よりの、非常に高度なご指導にて、
思い通りの操作を行えることが出来ました。まだ、wpを使い始めて2年目の初心者の私ですが、
お二人よりの指示の内容を理解するにつけ、
wpの素晴らしい「仕組み」の1部分を、垣間見れたような気がします。
このような、素晴らしい、
「wordpress.org 日本語」のフォーラムの運営者さんにも、
感謝いたします。★kjmtsh様へ、
非常に高いレベルでのご説明をいただき、
有難うございました。今後は、教えた頂いたことを、wpの運用時の基本として、
使わせていただこうと思います。お相手頂けたことを感謝いたします。
★nobita様へ、
細かいご指導を頂き、有難うございました。やりたい事が出来るようになりました。
また、フィルターの使用方法などもお聞きできました。
有難うございました。「余談:質問とは関係ありませんが、ご利用のプラグインには、古いものも含まれているようなので、全体的に見直しするといいと思います。
PHPの実行が可能なプラグインも使っているようですが、そういったものの中には、
例えば、コンテンツ本文に記述したコードが、WordPressの検索で検索できてしまうこともありますので、セキュリティ上のリスクが発生することがありますので、よく検討してみてください。」・・・なども、お教えいただき、ありがとございます。
特に、Exec-PHP などは不安があるので、
一度、見直しをしてみます。本当にありがとうございました。
- トピック「プラウザでのソース表示が変?」には新たに返信することはできません。