如何在正确的位置显示快捷码,当前显示在页面标题后的内容之前?

时间:2019-06-25 作者:Jen Brigham

使用显示子页面查询时,我在正确位置显示快捷码时遇到问题。

Can someone fix this for me? Thank you!

enter image description here

    function show_product_pages() {

global $post;
$child_pages_query_args = array(
    \'post_type\'   => \'page\',
    \'post_parent\' => $post->ID,

);
$child_pages = new WP_Query( $child_pages_query_args );

if ( $child_pages->have_posts() ) :
?>
<div class="columns product-archives">
<?php 
while ( $child_pages->have_posts() ) : $child_pages->the_post();
    ?>
        <div class="col col-md-4">
            <a href="<?php the_permalink(); ?>">
                <div class="product_thumb"><?php the_post_thumbnail(array(240, 240)); ?></div>
                <h3 class="product_title"><?php the_title(); ?></h3>
            </a>
            <div class="product-desc"><?php the_content($post->ID); ?></div>
            <a class="cta-link" href="<?php the_permalink(); ?>">Learn More </a>
        </div>
<?php endwhile; ?>
</div>
<?php endif;
wp_reset_postdata();
}
add_shortcode(\'show_product_pages\', \'show_product_pages\');

1 个回复
SO网友:fuxia

短代码回调必须返回字符串或什么都不返回。他们不能直接打印任何内容,因为这将创建一个即时输出,正如您在示例中看到的那样。我们已经有了一些关于这方面的话题。我冒昧地重新回答了你的问题,因为你说其他答案对你没什么帮助。:)

几乎每个直接打印内容的函数(通常在WordPress中称为模板标记)都有一个等价的返回字符串的函数,或者一个改变返回行为的参数。the_date() is a notable exception.

您可以通过查看本地WordPress副本中的源代码,或者访问developer manual 并搜索要替换的函数。此处将提到等效字符串。

现在,知道了这一点,您如何将其应用到自己的代码中?很明显,你不能再使用这样的东西了:

<?php 
// some code 
?>
some HTML
<?php
// more code
?>
…因为一些HTML将直接打印,而这正是我们不想要的。

我们必须写下:

<?php 
// some code 

$output = \'some HTML\';

// more code

return $output;
?>
这意味着,我们需要返回字符串的函数,将这些字符串插入到一些HTML中,最后将结果作为字符串返回。

下面是我将如何重写您的示例。请注意,我没有测试它。您可能会遇到一些以后必须修复的错误。:)

function show_product_pages() {

    $post = get_post();

    // Just in case the shortcode has been used in the wrong context.
    if ( empty( $post ) ) {
        return;
    }

    $child_pages = new WP_Query([
        \'post_type\'   => \'page\',
        \'post_parent\' => $post->ID,

    ]);

    // Always return as early as possible.
    if ( ! $child_pages->have_posts() ) {
        return;
    }

    $output = \'\';

    while ( $child_pages->have_posts() ) {
        // Set up post data.
        $child_pages->the_post();

        // Keep the dynamic values and the HTML template a bit separated.
        // Makes both parts easier to read, and we don\'t have to call a 
        // function twice.
        $url     = apply_filters( \'the_permalink\', get_permalink() );
        $thumb   = get_the_post_thumbnail( null, [240, 240]);
        $title   = the_title( \'\', \'\', FALSE );
        $content = apply_filters( \'the_content\', get_the_content() );

        // Now we add the HTML to $output.
        $output .= \'
        <div class="col col-md-4">
            <a href="\' . $url . \'">
                <div class="product_thumb">\' . $thumb . \'</div>
                <h3 class="product_title">\' . $title . \'</h3>
            </a>
            <div class="product-desc">\' . $content . \'</div>
            <a class="cta-link" href="\' . $url . \'">Learn More</a>
        </div>
        \';
    }

    // Clean up what we have done to the global context.
    wp_reset_postdata();

    // We add the container and return the whole string.
    return \'<div class="columns product-archives">\' . $output . \'</div>\';
}
就这样。有很多方法可以将动态逻辑和HTML进一步分离,但对于这样一个简单的情况,就可以了。

相关推荐

Do not parse shortcode in CPT

我有一个CPT,我不想在它的内容中解析shortcode(使用\\u content()函数)。我可以使用remove\\u filter删除短代码的默认过滤器。但我如何确定我只是为了我想要的CPT而删除过滤器?我有一个在页面中使用的快捷码[我的自定义快捷码]。此短代码使用WP\\U查询和输出CPT帖子。我不想在这篇CPT文章中分析短代码。我是否应该在短代码解析挂钩之前用虚拟内容更改短代码,并在之后替换回来?或者我应该在我的CPT输出之前删除短代码的默认过滤器,然后在我的CPT输出完成后再次添加短代码的默