带有自定义快捷代码的重复内容

时间:2019-04-08 作者:Moritz

车型年款中的序言functions.php 文件我添加了一个自定义短代码。此短代码将查询作为参数并查询wordpress数据库。它从那里获取帖子内容并返回。然后在非自定义页面上使用此短代码。

问题

在具有给定且正确查询的任何页面上使用快捷码,快捷码将显示格式正确的内容,但会显示两次。这是尽管查询只返回一篇文章。

所以我们假设我[query_post query=\'post_type="post"\'] 在页面上。快捷码返回该类型的所有帖子post (在我的例子中,这只是其中之一)。内容显示良好,但在页面末尾,已显示的内容再次重复。为什么会这样?

中的代码functions.php 我附加了以下内容:

function query_post_shortcode_function( $atts ) {   
    // Argument parsing
    $arguments = shortcode_atts( array(
        \'query\' => "",
    ), $atts );

    // Query
    $posts = query_posts( $arguments[\'query\'] );

    // Getting the content for each queried post
    unset($content);
    foreach ($posts as $post) {
        $content .= apply_filters( \'the_content\', $post->post_content );
    }

    return wpautop($content);
}   
add_shortcode( \'query_post\', \'query_post_shortcode_function\');
我已经说过,它将在wordpress数据库中查询帖子,然后返回其内容。

我已经采取了一些措施,没有添加所有帖子的内容,而是尝试分配内容。所以$content = apply_filters(...) 代替.=. 这并没有改变返回内容的第一次迭代中显示的结果,但不会在第二次迭代中显示

1 个回复
SO网友:Moritz

由于以下原因,解决方案尝试@AlexanderHolsgrove\'s注释,我尝试重新尝试一个简单字符串return wpautop($content); 我试过了return "test return";. 这将在查询的帖子内容顶部输出字符串。这很奇怪,因为我现在没有回应,也没有以任何方式返回帖子内容<因此,我尝试完全忽略回音,它仍然显示帖子内容。现在@MikeNGarret\'s和@mrben522\'s的答案开始发挥作用。在阅读SO answer 以及相应的WordPressCodex entry, 我发现了query_posts() 实际上有点取代了您正在运行查询的帖子(这有点让人困惑,请通读codex或查看答案以获得更多详细信息)。这最终给了我两个答案:

解决方案not 建议只使用query_posts(). 在我的情况下,它显示的内容很好,但据我所知,它根本不是最佳的should not 被使用。

真正的解决方案是WP_Query 或者更确切地说是它的存在。基本上,我重写了代码的整个下半部分来实现这一点:

function query_post_shortcode_function( $atts ) {   
    // Argument parsing
    $arguments = shortcode_atts( array(
        \'query\' => "",
    ), $atts );

    // Query
    $wpQuery = new WP_Query( $arguments[\'query\'] );

    // The Loop
    if ( $wpQuery->have_posts() ) {

        // Capture output
        ob_start();
        while ( $wpQuery->have_posts() ) {
            $wpQuery->the_post();
            echo apply_filters( \'the_content\', get_the_content() );
        }

        // Return output
        return ob_get_clean();
    }
}   
add_shortcode( \'query_post\', \'query_post_shortcode_function\');
我创建了一个WP\\u查询的新实例,并为其提供了一个参数。然后,我检查创建的实例是否有帖子,如果有帖子,我循环遍历它们,用应用的\'the content\' 滤器此输出由ob_start() 然后返回ob_get_clean().

到目前为止,它工作得完美无缺,完全符合我的目标。我希望其他人也能使用这些信息,我自己写的答案是正确的,不仅适用于我。

相关推荐

redirect if shortcode exists

WordPress初学者。我试图检查用户请求的页面中是否存在短代码,如果存在,则在用户未登录时重定向。function redirect_to_home() { if (has_shortcode(get_the_content(), \'shortcode\')) { if(!is_admin() && !is_user_logged_in()) { //redirect exit(); }