车型年款中的序言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(...)
代替.=
. 这并没有改变返回内容的第一次迭代中显示的结果,但不会在第二次迭代中显示
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()
.
到目前为止,它工作得完美无缺,完全符合我的目标。我希望其他人也能使用这些信息,我自己写的答案是正确的,不仅适用于我。