我的博客不属于我主网站的脚本。我在首页上提到了博客标题,缩略图和摘录。但是,如果博客文本中有撇号或类似内容,则踢出的文本会被搞砸在前端,从而导致奇怪的字符代替撇号。我一直在寻找如何解决这个问题的高低,但是已经空了。
看来我需要使用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; ?>
有没有人知道如何解决这个问题,因此摘录的文字不会用陌生字符替换撇号和引号?
答案 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("“", '"', $in);
$in = str_replace("”", '"', $in);
$in = str_replace("’", "'", $in);
$in = str_replace("‘", "'", $in);
$in = str_replace("–", "-", $in);
$in = str_replace("…", "...", $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