将html添加到帖子/页面标题的合适过滤器是什么?

时间:2013-01-19 作者:Ben Sharon

我想在我的博客上使用缅甸Unicode文本。不幸的是,伪Unicode缅甸字体很常见。因此,我正在编写一个插件,它将使用HTML span标记包围所有缅甸短语,并使用css选择适当的字体。

对于内容、评论等,一切都很好。但是,在使用\\u title挂钩添加HTML之后,该HTML会被转义,然后包含在最近的帖子部分中链接标记的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;
}
现在,最近发布的侧栏小部件中链接的标题属性设置为:

LatinTextHere &lt;span class=&#039;myText&#039;&gt;ကကကကက&lt;/span&gt;<span class=\'myText\'>ကကကကက</span> MoreLatinText
这是不对的。

4 个回复
最合适的回答,由SO网友: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\' ); ?>
这不太理想,至少有两个原因:

最近发布的小部件等位置的标题不会插入跨距,这意味着,根据查看器浏览器、字体设置和安装的字体,查看器仍会在这些位置看到损坏的文本。

这使得与其他缅甸语博客分享插件变得更加困难,这些博客可能没有修改主题的技术技能,也可能不想使用我的主题。

注意wordpress开发人员:我在网上看到很多人希望在他们的帖子和页面标题中包含HTML。允许我们这样做很有意义,不仅对于像我这样的特殊情况,而且对于那些想用其他方式更改标题的用户来说。请考虑将来更改WordPress以允许在标题中使用HTML。

SO网友:Chip Bennett

现在发生的是the_title_attribute(), 它在最近发布的小部件链接、调用中输出title属性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\' );
因此,这将阻止您的过滤器应用于Nav菜单项、最近发布的小部件等-除了主查询循环之外的任何内容。

I\'ll leave this here as an answer, in case anyone can think of a way to identify the current $query object.

SO网友:s_ha_dum

the_title 是正确的挂钩。您可以通过以下方式确认checking the source.

你所做的有点奇怪,但这是有道理的。聪明的解决方案,但我不认为这是意料之中的。您遇到的问题似乎是这一行:

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 不会通过任何你可以操纵的东西传递。

我认为你可能需要重新考虑你的方法。

如果这是一种可以编辑主题的情况,则可以在侧栏运行之前删除过滤器,然后再添加回来。我认为这是最直接的方法,但在你的情况下可能不可能。

您还可以编写自己的最近帖子小部件。

你可以用Javascript操作字体,但不确定它是否足够健壮。

您可以检查$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;
}
我不知道这是否可行,但如果可行,它会给你一些东西来打开,你就不必编辑主题了。Edit: 已测试。遗憾的是,这不起作用。

SO网友:kaiser

只需使用htmlspecialchars(), 这是一个本机PHP函数。

从手册中:

执行的翻译包括:

  • \'&\' (符号)变为\'&amp;\'
  • \'"\' (双引号)变为\'&quot;\' 什么时候ENT_NOQUOTES 未设置
  • "\'" (单引号)变为\'&#039;\' (或&apos;) 仅当ENT_QUOTES 已设置
  • \'<\' (小于)成为\'&lt;\'
  • \'>\' (大于)变成\'&gt;\'
结束

相关推荐

Blog post not showing title

在我的主要网站NewMediaNook上。wordpress。com,一篇特定的帖子没有显示标题(请参见下图)。当我只在那篇文章上时,标题就会出现,而所有其他标题都会出现在主站点上。。。但那个并没有出现。无论登录状态如何,所有浏览器看起来都一样。我可以用代码添加它吗??(我只是不想冒着额外代码的风险把它扔掉,或者在一些随机点上两次显示标题)。对不起,我是WordPress的新手,所以我不确定还需要什么其他信息。但我们非常感谢您的帮助!