上述问题有很多错误。首先,post_parent 在查询中,参数必须是整数。您正在为其分配一个字符串。对wordpress函数的许多调用,例如the_excerpt() 和wp_reset_query() 缺少结尾分号。$atts 是短代码属性的关联数组。如果要使用属性,则需要在shortcode函数中提取属性。没有必要将它们传递给循环函数,特别是考虑到您事先没有提取它们。此外,您甚至没有尝试在其中使用它们。
此外,我不明白为什么要将它分为两个函数。我不会在函数和用法中包含直接标记ob_get_clean 要么,但是echo 或return 直接获得所需的结果。后两者或多或少是个人喜好。
也就是说,这将满足您的需求:
function andrew_loop_shortcode( $atts ) {
    extract( shortcode_atts( array(
        \'parent\' => 8,
        \'type\' => \'page\',
        \'perpage\' => 4
    ), $atts ) );
    $output = \'<div class="clear"></div><div class="childs grid_12">\';
    $args = array(
        \'post_parent\' => $parent,
        \'post_type\' => $type,
        \'posts_per_page\' => $perpage,
        \'sort_column\'   => \'menu_order\'
    );
    $andrew_query = new  WP_Query( $args );
    while ( $andrew_query->have_posts() ) : $andrew_query->the_post();
        $output .= \'<div id="service-hp">\'.
                   get_the_post_thumbnail(\'home-thumb\').
                   \'<h2 style="margin-bottom:5px">\'.
                   get_the_title().
                   \'</h2>\'.
                   get_the_excerpt().
                   \'<a class="read-more" href="\'.
                   get_permalink().
                   \'">en savoir plus <img src="\'.
                   get_bloginfo( \'template_url\' ).
                   \'/images/read-more.png"></a></div><!--  ends here -->\';
    endwhile;
    wp_reset_query();
    $output .= \'</div>\';
    return $output;
}
add_shortcode(\'andrewloop\', \'andrew_loop_shortcode\');
 上面的第2-6行并不是绝对必要的,但增加了快捷代码的功能。
如果您只是使用[andrewloop] 在现在的页面中,它将显示您当前的目标。为了实现这一点,可以在shortcode函数中静态设置查询参数。然而,对于第2-6行,这些现在是短代码的默认值,但它们可以在不再次修改函数的情况下动态更改。
有了以上内容,您现在可以使用[andrewloop parent="6" perpage="3"] 例如。因此,短代码可以用于多个不同的查询。
进一步阅读,以防您介意: