为什么apply_filter('the_content')没有输出任何内容?

6
我尝试了很多php的组合来让wordpress输出$post->post_content作为格式化文本(与echo $post->post_content给我的原始格式化不同)。这个组合似乎是最有希望的,但它没有输出任何东西。有什么建议吗?
(就是这行代码:post_content); ?>)
<?php query_posts('orderby=menu_order&order=asc&posts_per_page=-1&post_type=page&post_parent='.$post->ID); if(have_posts()) { while(have_posts()) { the_post(); ?>
    <div class="page">
        <?php
            global $wpdb;
            $subs = $wpdb->get_results("SELECT * FROM $wpdb->posts WHERE post_parent='$post->ID' AND post_type='page' AND post_status='publish'");
            if($subs) {
        ?>
        <div class="navi"></div>
        <a class="naviNext"><img src="<?php bloginfo('template_url'); ?>/images/navi-next.png" alt="" /></a>
        <div class="scrollable">
            <div class="items">
                <?php foreach($subs as $s) { ?>
                <div class="item">
                    <h2><?php echo $s->post_title; ?></h2>
                    <?php $content = apply_filters('the_content', $s->post_content); echo $content; ?>
                </div>
                <?php } ?>
            </div>
        </div>
        <?php } else { the_content(); } ?>
    </div>
    <?php } } wp_reset_query(); ?>

不知道你为什么没有得到任何输出,完全相同的代码在我的 WP 安装中可以正常工作。 - shamittomar
7个回答

14
据我所知,应用主要“格式化”内容的函数是wpautop()。这个函数应该由 WordPress 钩子函数“the_content”调用。虽然该函数会做一些烦人的事情(例如搞乱嵌入代码),但有很多插件可以从过滤器堆栈中取消挂钩。请尝试替换您的一行代码:
<?php $content = apply_filters('the_content', $s->post_content); echo $content; ?>

使用

<?php $content = wpautop($s->post_content); echo $content; ?>
如果这有所帮助,那么你可能遇到了wpautop在某个地方被取消挂钩的问题。

通过检查所有插件的 add_filter('the_content", ... 代码,发现一个旧的 'WordPress 相关文章' 插件使用了错误的语法代码。通过检查插件的网站,发现它只支持到 4.x 版本的 WordPress,而现在网站已经更新到了 5.x 版本。停用该插件解决了问题。奇怪的是,在服务器日志中没有发现任何错误! - Sunry

3
我曾经遇到过同样的问题。原来我的主题中有一个函数也过滤了“内容”,但是其中有一个错误导致该过滤器返回了一个空字符串。
因此,请检查您的主题和插件中是否有过滤“the_content”的功能。例如,在Sublime Text 2中,您可以使用⌘/CTRL + + F进行快速的“文件搜索”,以找到可能的罪魁祸首。

1

man86,

我看到你正在通过$wpdb->get_results()获取帖子数据。关于它的问题是数据是原始返回的,所以在使用常见的帖子函数(如the_content())之前,您需要“准备”它。

试试这个怎么样(请参阅代码注释):

<?php query_posts('orderby=menu_order&order=asc&posts_per_page=-1&post_type=page&post_parent='.$post->ID); 

if(have_posts()) { while(have_posts()) { the_post(); ?>
<div class="page">
    <?php
        global $wpdb;
        $subs = $wpdb->get_results("SELECT * FROM $wpdb->posts WHERE post_parent='$post->ID' AND post_type='page' AND post_status='publish'");
        if($subs) { ?>
    <div class="navi"></div>
    <a class="naviNext"><img src="<?php bloginfo('template_url'); ?>/images/navi-next.png" alt="" /></a>
    <div class="scrollable">
        <div class="items">
            <?php foreach($subs as $post) { // <-- changed $s to $post
            setup_postdata($post) // <--use setup_postdata to prepare post
             ?>
            <div class="item">
                <h2><?php the_title(); // <-- use "the_title() now that the data has been prepared ?></h2>
                <?php the_content(); // <-- use "the_content() now that the data has been prepared ?>
            </div>
            <?php } ?>
        </div>
    </div>
    <?php } else { the_content(); } ?>
</div>
<?php } } wp_reset_query(); ?>

参考:http://codex.wordpress.org/Class_Reference/wpdb#Examples_5(“获取用户5的所有草稿信息”)

谢谢,希望能有所帮助!

Vq.


0

您需要使用 echo 命令来输出 apply_filters 调用的结果:

<?php echo apply_filters('the_content', $s->post_content); ?>

或者,按照你编写的代码:

<?php 
    $content = apply_filters('the_content', $s->post_content); 
    echo $content;
?>

糟糕!没有注意到你在原始示例中已经这样做了。如果只是 echo $s->post_content;,您会得到帖子的原始格式吗? - Pat
是的 - echo $s->post_content 给我原始格式,但回显过滤器不会。 - HandiworkNYC.com

0

抱歉如果这太基础了,但回显内容可能会有所帮助:

<?php
$content = apply_filters('the_content', $s->post_content);
echo $content;
?>

0

这看起来是朝着正确方向迈出的一步...我不会在任何地方添加过滤器,只是应用它。在这种情况下,我该如何添加它?谢谢! - HandiworkNYC.com
您应该能够通过主题的functions.php文件轻松添加它。 - Adam Tootle
我刚刚回顾了一下你的原始帖子,你可能还可以在for循环中使用setup_postdata($s),然后再使用the_content()。你可以在这里看到它的用法 - http://codex.wordpress.org/Template_Tags/get_posts#Posts_list_with_offset - Adam Tootle

0

嗯...出于某种原因,当我删除顶部和底部行时,无法显示内容。

也许问题在于query_posts调用...而不是apply_filters()调用。

我可以根据是否使用apply_filters()来切换显示模式。我相信这就是你想要的。


仅仅使用 <?php echo $s->post_content; ?> 会给我带来未格式化的内容(p 标签和所有格式都被剥离),因此我正在尝试使用 "the_content_ filter" 来获取富文本。 - HandiworkNYC.com
抱歉,我表达不够清晰。我移除了对query_posts()的调用...这解决了我的问题。在那之后,我能够使用the_content_filter并得到了期望的结果。这就是为什么我想看看你是否可以通过修改或移除对query_posts()的调用来获得相同的结果。 - kenzaraque
我最初认为query_posts可能是问题所在。如果删除它确实解决了问题,那么我认为最有可能的解释是$post全局变量已经被填充了“其他”数据,并且其中一个挂钩过滤器正在从全局变量中读取内容。WordPress似乎可以很好地处理这个问题,所以很可能是一个编写不良的插件/functions.php文件导致的。从数据库中读取数据总是会引起问题。使用WordPress的API——它更容易,并且它将确保必要的全局变量被填充并触发必要的过滤器/操作。 - Brendon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接