如何从Wordpress循环中转义the_excerpt()中的字符

时间:2011-07-07 04:22:45

标签: php wordpress

我的博客不属于我主网站的脚本。我在首页上提到了博客标题,缩略图和摘录。但是,如果博客文本中有撇号或类似内容,则踢出的文本会被搞砸在前端,从而导致奇怪的字符代替撇号。我一直在寻找如何解决这个问题的高低,但是已经空了。

看来我需要使用esc_html()函数,但我不知道如何使用the_excerpt。我绝对不是一个PHP人。

我有这段代码:

<?php while (have_posts()): the_post(); ?>
<h3><?php the_title(); ?></h3>
<img  style="float: left; padding: 13px 20px 0px 0px;" src="<? echo catch_that_image(); ?>" width="100">
<?php the_excerpt(); ?>
<p><a href="<?php the_permalink(); ?>">Read more...</a></p>
<?php endwhile; ?>

有没有人知道如何解决这个问题,因此摘录的文字不会用陌生字符替换撇号和引号?

3 个答案:

答案 0 :(得分:3)

the_excerpt直接输出内容。相反,请使用get_the_excerpt返回内容并将其放入变量中,或将其提供给esc_html

<?php echo esc_html(get_the_excerpt()); ?>

对于大多数格式为the_X()的Wordpress函数,get_the_X()也存在。

也就是说,the_excerpt()通常会自行生成有效的输出,因此您可能需要验证您的站点与Wordpress之间的字符集是否匹配。这意味着您的网站页面应该以utf-8提供。

答案 1 :(得分:1)

这通常意味着您将页面作为UTF-8以外的其他内容提供服务,而WordPress正在用UTF-8中的其他版本(“智能引号”)替换某些字符。当您将文本复制并粘贴到具有奇数编码的帖子时,也会发生这种情况。 Microsoft Word是一个常见的来源,因为它喜欢用专有编码将所有引号转换为卷曲引号。如果您进行了复制和粘贴,请尝试粘贴到没有格式化的地方(记事本很好)并从那里重新复制。否则,它的WordPress需要修复。请注意,这里不是你想要的esc_html - 这只会给你一组不同的问题。

这里有两种方法:第一种,也是最好的方法是确保你正在使用正确的编码提供页面。您可以使用浏览器的调试功能(“页面信息”,或Firebug或Web Inspector的网络面板)进行检查,也可以通过W3 validator运行页面轻松地在线完成。它会告诉您结果页面上的编码。如果它不是UTF-8,那就有问题了。如果您自己生成页面,可以直接用PHP修复它:

<?php header("Content-type: text/html; charset=UTF-8");?>

就在页面顶部。 WordPress的库代码通常会自己做,所以它可能不适合你。某些服务器设置为不允许以这种方式覆盖,在这种情况下,配置它将根据您使用的服务器而有所不同。对于Apache,请参阅AddDefaultCharset的文档,了解其中一种方法。 您的服务器可能配置为不允许您以这种方式覆盖设置,或者您不希望具有该编码,在这种情况下您需要选项二。

如果第一个选项不可用,或者您不想这样做,那么还有另一个选项。我们可以强迫WordPress完全不做这些替换。 WordPress的wptexturize()函数执行该转换,该转换作为the_excerpt的过滤器链的一部分应用。您可以使用以下PHP代码将其从过滤器链中删除:

<?php remove_filter( "the_excerpt", "wptexturize"); ?>

您可以将它放入主题中的functions.php或基本插件中,但也有一个插件可供您使用:wpuntexturize将禁用任何地方的智能字符转换。这确实让事情看起来有点丑陋,但它应该可以使一切运转起来。

使用WordPress的过滤系统,也可以对问题字符应用一个小的反向变换。像这样:

function local_fix_quotes($in) {
    $in = str_replace("&#8220;", '"', $in);
    $in = str_replace("&#8221;", '"', $in);
    $in = str_replace("&#8217;", "'", $in);
    $in = str_replace("&#8216;", "'", $in);
    $in = str_replace("&#8211;", "-", $in);
    $in = str_replace("&#8230;", "...", $in);
    $in = str_replace("\xC2\xA0",' ',$in);
    $in = str_replace("\xE2\x80\x99","'",$in);
    $in = str_replace("\xE2\x80\x9C",'"',$in);
    $in = str_replace("\xE2\x80\x9D",'"',$in);
    $in = str_replace("\xE2\x80\x93",'-',$in);
    return $in;
}
add_filter( "the_excerpt", "local_fix_quotes" );
插件中的

或者functions.php将不会转换智能引号并破译成它们的普通ASCII等价物。

如果您在WordPress之外生成它,那么任何这些代码选项都可以直接进入您的PHP页面,只要它们包含WordPress库代码之后。当你这样做时,你必须在页面顶部,在任何其他代码输出之前要求wp-blog-header。如果页面已经开始输出,WordPress将无法更改已发送的编码。页面顶部可能如下所示:

<?php 
define('WP_USE_THEMES', false);
require_once('./wp-blog-header.php');
remove_filter( "the_excerpt", "wptexturize");
?>
<html>

如果页面顶部不需要wp-blog-header,请确保它首先出现并查看问题是否自行解决。如果您的页面故意使用不同的编码,则无关紧要,并且无论如何都要禁用字符替换。对于在WordPress中生成的页面,在这种情况下插件方法最好。

答案 2 :(得分:0)

当然你在每个页面的标题中使用相同的字符集编码?:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

或在非Wordpress页面上调用blog-header?

<?php require('/the/path/to/your/wp-blog-header.php'); ?>

re:http://codex.wordpress.org/Integrating_WordPress_with_Your_Website