web-dev-qa-db-ja.com

投稿/ページタイトルにhtmlを追加するための適切なフィルタは何ですか?

私のブログではミャンマーのUnicodeテキストを使いたい。残念ながら、疑似Unicodeのミャンマー語フォントが一般的です。だから、私はすべてのミャンマー語句をHTMLのspanタグで囲み、適切なフォントを選択するためにcssを使用するプラグインを書いています。

内容、コメントなどはすべてうまく機能します。しかし、the_titleフックを使用してHTMLを追加すると、そのHTMLはエスケープされ、最近の投稿セクションのlinkタグのtitle属性に含まれます。さらに、私は私の管理者投稿画面の投稿名に生のHTMLタグを見ています。

この問題を解決するにはどうすればいいですか。テーマファイルなどを変更するのではなく、自分のプラグインからすべてを実行することを好みます。

これが私のコードです:

add_filter( 'the_title', 'addThemSpans');
function addThemSpans($theTitle) {
  // functionality to add span tags to $theTitle so that a title that looks like this...
    // LatinTextHere ကကကကက​ MoreLatinText
  // becomes this...
    // LatinTextHere <span class="myText">ကကကကက</span> MoreLatinText
    // in the final output.
  return $theModifiedTitle;
}

今のところ、最近の投稿のサイドバーウィジェットのリンクのtitle属性は次のように設定されています。

LatinTextHere &lt;span class=&#039;myText&#039;&gt;ကကကကက&lt;/span&gt;<span class='myText'>ကကကကက</span> MoreLatinText

これは正しくありません。

3
Ben Sharon

他の誰かが同じ問題を抱えている場合に備えて、私は最終的な解決策をここに掲載することを考えていました。基本的に、私は私のテーマファイルに新しいフックを追加し、そしてそれらのフックに修正された投稿のタイトルを送信する必要があります。

私のプラグインコードは今のようになります:

add_filter( 'the_html_safe_title', 'addThemSpansToPostTitles' );
function addThemSpansToPostTitles() {
  global $post;
  echo addThemSpans($post->post_title);
  // This is the same function I listed in the question.
}

次に、テーマテンプレートファイルで、以前は次のようになっていました。

<?php the_title(); ?>

それを次のように変更します。

<?php do_action( 'the_html_safe_title' ); ?>

これは、少なくとも2つの理由から理想的とは言えません。

  1. [最近の投稿]ウィジェットなどの場所のタイトルにはスパンが挿入されません。つまり、ビューアブラウザ、フォント設定、およびインストールされているフォントによっては、ビューアにはこれらの場所にテキストの破損が表示されます。

  2. このため、テーマを変更するための技術的なスキルがなく、自分のテーマを使用したくない場合がある他のミャンマー言語のブロガーとプラグインを共有することが非常に難しくなります。

注目のワードプレス開発者: 私は、投稿やページのタイトルにHTMLを含めることを望んでいる多くの人々をオンラインで見てきました。私たちがそうすることを許可することは私のような特殊な状況だけでなく、他の方法で自分のタイトルを変えたいユーザーにとってはとても意味があります。タイトルにHTMLを使用できるように今後のワードプレスを変更することを検討してください。

1
Ben Sharon

そのため、最近の投稿ウィジェットのリンクにtitle属性を出力するthe_title_attribute()get_the_title()を呼び出しています。したがって、the_titleフィルタは、the_title_attribute()によって返される文字列に適用されています。

ひとつの考えは、get_the_titleがメインの問い合わせループの中から呼ばれることを確実にすることです(注意:WP_Query()ループを使うなら、このアプローチはそれらのために働かないでしょう)。

おそらくこのようなもの(未テスト)です。

編集する

これは記述どおりには機能しません。現在の$queryオブジェクトをget_the_title()内から取得する方法が見つかった場合は、次のようにします。

function wpse82297_filter_the_title( $title ) {
    // Need some way to identify the current query object
    $query = '';
    // If this isn't the main query, return
    if ( ! $query->is_main_query() ) {
        return $title;
    } else {
        // Your $title filtering goes here
        return $modified_title;
    }
}
add_filter( 'the_title', 'wpse82297_filter_the_title' );

そのため、これはあなたのフィルタがナビゲーションメニュー項目や最近の投稿ウィジェットなどに適用されるのを防ぎます - メインの問い合わせループ以外は何でも。

現在の$queryオブジェクトを識別する方法を誰かが考えることができるように、私はこれを答えとしてここに残します。

1
Chip Bennett

the_titleが正しいフックです。 ソースをチェックすることでそれを確認できます

あなたがしていることは少し変ですが、それは理にかなっています。巧妙な解決策が、私はそれが期待されていたとは思わない。あなたが持っている問題はこの行にあるようです:

http://core.trac.wordpress.org/browser/tags/3.5/wp-includes/default-widgets.php#L574

<a href="<?php the_permalink() ?>" title="<?php echo esc_attr( get_the_title() ? get_the_title() : get_the_ID() ); ?>"><?php if> (get_the_title() ) the_title(); else the_ID(); ?></a>

そしてあなたを助けるフックはありません。ウィジェットはget_the_titleでタイトルをつかみます、そしてあなたが操作することができる何かを通してそれを渡しません。

私はあなたがあなたのアプローチを再考する必要があるかもしれないと思います。

  1. これがテーマを編集できる状況である場合は、サイドバーが実行される前にフィルタを削除し、後で追加することができます。私はそれがそれをする最も直接的な方法であると思いますが、あなたの場合は不可能かもしれません。

  2. 最近の投稿ウィジェットを書くこともできます。

  3. あなたはJavascriptであなたのフォントを操作することができました - それがあなたにとって十分に堅牢であることを確信していません。

あなたはあなたのfilteで$instance変数をチェックして、あなたがウィジェットを扱っているかどうかを整理することができるかもしれません。

add_filter( 'the_title', 'addThemSpans');
function addThemSpans($theTitle) {
  global $instance;
  var_dump($instance); // see if this works.
  // functionality to add span tags to $theTitle so that a title that looks like this...
    // LatinTextHere ကကကကက​ MoreLatinText
  // becomes this...
    // LatinTextHere <span class="myText">ကကကကက</span> MoreLatinText
    // in the final output.
  return $theModifiedTitle;
}

それがうまくいくかどうかはわかりませんが、そうであればスイッチを入れる必要があるので、テーマを編集する必要はありません。編集:テスト済み。残念ながら、うまくいきません。

1
s_ha_dum

あなたはそれらをネイティブのPHP関数である htmlspecialchars() を使って単純に元に戻すことができます。

マニュアルから:

実行された翻訳は次のとおりです。

  • '&'(アンパサンド)は'&amp;'になります
  • '"'が設定されていない場合、'&quot;'(二重引用符)はENT_NOQUOTESになります。
  • "'"(一重引用符)は、'&#039;'が設定されている場合にのみ&apos;(またはENT_QUOTES)になります。
  • '<'(より小さい)は'&lt;'になります
  • '>'(より大きい)は'&gt;'になります

とにかく、私はあなたが個人的にすべてのユーザーを知らない(そして彼らがインターネットのセキュリティを心配し、パスワードを再利用しないということを知っている)ならばこれをしません。あなたがそれらの文字を変換して戻すとき、誰かがあなたの文字列をエスケープしてあなたのインストールの中でファンキーなものをしているならば、あなたは救われません。

0
kaiser