这里有两个大问题,一些小问题和一些改进的空间。让我们先看看你的主要错误
您做得很好的是将输出添加到变量,然后最终返回变量。短代码应始终返回其输出,而不是回显它。您在这里犯的错误是使用了错误的模板标记。这个the_*
前缀表示模板标记正在回显其输出,而不是返回它。您应该将模板标记用于get_*
返回其输出的前缀
你不应该挂起你的短代码,特别是init
. init
对于大多数功能,运行到很早,到那时它们还没有注册。这就是为什么您的短代码不输出任何内容
一些较小的错误:
您应该使用wp_reset_postdata()
, 不wp_reset_query()
. 后者用于query_posts
你绝对不能用它
wp_reset_postdata()
应在关闭后立即使用while
在关闭if
陈述如果您没有任何帖子,这将阻止重置不存在的内容在使用变量之前,应先定义变量before 循环。如果您没有,并且没有帖子,这将导致一个未定义的变量通知,这就是bug,我们不希望出现bug
现在,让我们来看看本质的东西。这不会提高性能,可以省略。这只是让代码更可读、更易于调试的提示
虽然它是有效的php,但不要使用:
和endwhile
和endif
. 主要原因是调试和可读性。大多数(我倾向于说不)代码编辑器不支持这种语法,这使得调试成为一场噩梦。问我在使用这种语法的while和if语句调试时,它有多令人沮丧。我更喜欢旧的花括号(大括号),它受到所有代码编辑器AFAIK的支持,可以轻松地进行调试
正确地缩进代码,这对可读性和调试有很大帮助
在声明函数之前,请始终添加操作。随着php中闭包的引入,这样做更有意义
不要在第一行将10行代码连接到一个变量,一行代码可能会丢失。分别正确连接每一行
您可以尝试以下方法:
add_shortcode(\'service-shortcode\', \'service_shortcode\');
function service_shortcode()
{
$return_string = \'\';
$service = new WP_Query(array(
\'orderby\' => \'rand\',
\'post_type\' => \'our_service\' ,
\'posts_per_page\' => 1,
));
if ($service->have_posts()) {
while ($service->have_posts()) {
$service->the_post();
$return_string .= \'<div class="row">\';
$return_string .= \'<div class="col-md-3 col-sm-6">\';
$return_string .= \'<div class="content">\';
$return_string .= \'<h2>\'.get_the_title().\'</h2>\';
$return_string .= \'<p>\'.get_the_content(\'\').\'</p>\';
$return_string .= \'</div>\';
$return_string .= \'</div>\';
$return_string .= \'</div>\';
}
wp_reset_postdata();
}
return $return_string;
}