Scenario i wanted to build
人们可以在我的WordPress环境中多次使用可重用组件。
My solution for the problem
我制作了一个名为“Componenten”的自定义帖子类型。我制作了一个自定义的短代码,以便在“Componenten”帖子类型中只显示一篇帖子,并将帖子的名称用作短代码参数。以下是我的短码代码和以下函数:
<?php
/**
* Register all shortcodes
*
* @return null
*/
function register_shortcodes() {
add_shortcode( \'component\', \'shortcode_components\' );
}
add_action( \'init\', \'register_shortcodes\' );
function shortcode_components( $atts ) {
global $wp_query,
$post;
$component_name = $atts[\'naam\'];
$loop = new WP_Query( array(
\'post_type\' => \'componenten\',
\'name\' => $component_name
) );
if( ! $loop->have_posts() ) {
return false;
}
while( $loop->have_posts() ) {
$loop->the_post();
return the_content();
};
wp_reset_postdata();
}
Problem
快捷码工作正常,它根据名称检索自定义帖子类型并显示它。然而例如,当我用短代码更新wordpress中的页面时
[component naam="test"]
我更新了页面,它重定向到显示帖子的页面,没有任何样式。它不会循环回我添加短代码的管理编辑页面。每隔一页都可以。只有在添加自定义快捷码时才会出现这种情况。所以问题出在我的短代码中的某个地方。
Things i\'ve tried
我已经注释掉了函数的不同部分,以查看发生了什么。当我发表评论时,问题没有发生:
while( $loop->have_posts() ) {
$loop->the_post();
return the_content();
};
但是,不用说,我的短代码当然不再有效了。
最合适的回答,由SO网友:Jacob Peattie 整理而成
短代码需要return
他们的价值观,但是the_content()
echo
编辑帖子内容。
所以你有两个选择。首先是捕获所有输出,然后在最后返回:
ob_start(); // Start capturing output;
while( $loop->have_posts() ) {
$loop->the_post();
the_content();
};
wp_reset_postdata();
return ob_get_clean(); // Return captured output;
如果您想捕获HTML和模板标记或部分的输出,这将是最干净的方法。
另一个选项是将内容放入变量中。“get”等效于the_content()
是get_the_content()
, 但它会尝试使用“阅读更多”标签等奇怪的东西,所以最简单的方法就是获取原始信息$post->post_content
使用the_content
应用的筛选器:
global $post;
// etc. etc.
while( $loop->have_posts() ) {
$loop->the_post();
$content = apply_filters( \'the_content\', $post->post_content );
};
wp_reset_postdata();
return $content;
还要注意如何代替
return
在循环内部,我将值放入一个变量中,并在最后返回它。这是因为如果在函数的前面返回
wp_reset_postdata()
将永远不会运行,这可能会导致页面上的其他循环出现问题。