在循环时用简码打破ACF灵活部分

时间:2019-10-08 19:24:47

标签: wordpress advanced-custom-fields

对于Wordpress,使用高级自定义字段(ACF)灵活的部分,我有各种很好的灵活字段。我已经使用ACF多年了,后来又开始使用灵活的部分。

我注意到,当我在弹性部分(WYSWIG编辑器或类似工具)中插入短代码时,它会中断循环,并且以下弹性部分都不会出现在页面或检查器/ DOM中。我认为简码打破了while循环。

这里是我当前要在页面中插入的简码。可以,但是后面的其余页面部分丢失了。

function spotlight_boxes( $atts ){
        $args = array( 'post_type' => 'customer-spotlight', 'posts_per_page' => -1, 'post_status' => 'publish' );
        $loop = new WP_Query( $args );

        $loopTitle = $atts['title'];

        ob_start(); ?>
        <section class="feature-boxes page">
            <h2 class="center std section-title"><?php echo $loopTitle; ?></h2>
            <div class="small-wrap">
                <div class="boxes flex">
                    <?php while ( $loop->have_posts() ) : $loop->the_post(); 
                        $customer_logo = get_field("customer_logo");
                        ?> 
                        <div class="feature-box">
                            <span class="tag-btn">Spotlight</span>
                            <img src="<?php the_post_thumbnail_url(); ?>" width="100%"/>
                            <div class="feature-info">
                                <img src="<?php echo $customer_logo['sizes']['medium']; ?>" width="100%">
                                <h5 class="std"><?php the_field('overview_title'); ?></h5>
                                <a href="<?php the_permalink(); ?>" class="learnmore">Learn More</a>
                            </div>
                        </div>
                    <?php endwhile; ?>
                </div>
            </div>
        </section>
        <?php

        return ob_get_clean();
}
add_shortcode( 'spotlight_boxes', 'spotlight_boxes' );

1 个答案:

答案 0 :(得分:0)

这是因为您正在使用以前用短代码代替的功能来生成内容。如Wordpress Codex中所述,由简码调用的函数绝不能产生任何形式的输出。简码函数应返回将用于替换简码的文本。直接产生输出会导致意外结果。这类似于过滤器函数的行为方式,因为它们不能从调用中产生预期的副作用,因为您无法控制从何时何地调用它们。

例如,如果您创建的HTML需要用简码替换,则示例返回应类似于

$html = '<div class="test-field">';
$html .= get_field('test-field');
$html .= '</div>';
return $html;

不是这样

the_field('test-field');