快码输出内容时出现问题

时间:2015-03-03 作者:Hussy571

我正在尝试制作一个快捷码,输出包含自定义帖子类型内容的a div。我可以输出内容,但内容不能在div内输出。shortcode分别输出div和content。我是Wordpress的新手。请帮忙。这是我的代码:

<?php

function service_shortcode() {
$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">
                        <div class="col-md-3 col-sm-6">
                        <div class="content">
                        <h2>\'.the_title().\'</h2>
                        <p>\'.the_content(\'\').\'</p>
                        </div>
                        </div>
                        </div>\';
  endwhile;
  endif;
  wp_reset_query();
  return $return_string;
  }

function register_shortcodes(){
add_shortcode(\'service-shortcode\', \'service_shortcode\');
}

add_action( \'init\', \'register_shortcodes\');

?>
提前感谢。。。

1 个回复
最合适的回答,由SO网友:Pieter Goosen 整理而成

这里有两个大问题,一些小问题和一些改进的空间。让我们先看看你的主要错误

您做得很好的是将输出添加到变量,然后最终返回变量。短代码应始终返回其输出,而不是回显它。您在这里犯的错误是使用了错误的模板标记。这个the_* 前缀表示模板标记正在回显其输出,而不是返回它。您应该将模板标记用于get_* 返回其输出的前缀

你不应该挂起你的短代码,特别是init. init 对于大多数功能,运行到很早,到那时它们还没有注册。这就是为什么您的短代码不输出任何内容

一些较小的错误:

您应该使用wp_reset_postdata(), 不wp_reset_query(). 后者用于query_posts 你绝对不能用它

  • wp_reset_postdata() 应在关闭后立即使用while 在关闭if 陈述如果您没有任何帖子,这将阻止重置不存在的内容

    在使用变量之前,应先定义变量before 循环。如果您没有,并且没有帖子,这将导致一个未定义的变量通知,这就是bug,我们不希望出现bug

    现在,让我们来看看本质的东西。这不会提高性能,可以省略。这只是让代码更可读、更易于调试的提示

    虽然它是有效的php,但不要使用:endwhileendif. 主要原因是调试和可读性。大多数(我倾向于说不)代码编辑器不支持这种语法,这使得调试成为一场噩梦。问我在使用这种语法的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;
    }
    

  • 结束

    相关推荐

    查询&_Content()显示在标题中

    这篇文章讲的是两件事:此查询的所有结果都会发布到页面的标题,而不是内容区域中的标题。您知道为什么会发生这种情况的解决方案,以及解决这种情况的最简单方法吗?你能评论一下我的问题吗?我想知道它的所有错误(但它正在工作,并产生预期的结果)add_action( \'pre_get_posts\', \'cv_testimonials_list\'); function cv_testimonials_list($query) { if ($query->is_page(