ACF 未显示在 Wordpress 模板部件中

ACF not displaying in Wordpress Template Parts

我正在使用 ACF 插件为我的 wordpress 网站创建自定义字段。当我将代码全部放在同一页面上时,一切都进展顺利,问题为零。然而,当我将代码分解为模板部分时,每个部分的英雄和自定义字段的 ACF 停止输出数据。几乎就像在模板部分中使字段读取为空一样,但是当我重新排序 get_template_parts php(即,将内容卷移动到内容披萨之前,反之亦然),无论哪个部分出现第一个正确显示而第二个不正确。

<?php get_template_part('template-parts/home/content', 'callout'); ?>
        
<?php get_template_part('template-parts/home/content', 'menu'); ?>
    
<?php get_template_part('template-parts/home/content', 'pizza'); ?>
        
<?php get_template_part('template-parts/home/content', 'rolls'); ?>

如果我将 content-menu.php 移动到 content-pizza.php 下,同样的事情也会发生——ACF 不再显示在后端填充了任何内容。我怀疑问题出在 content-pizza.php(content-rolls.php 是复制的相同代码,并填写了正确的变量),但我看不出问题是什么。

内容-pizza.php页面编码为:

<?php
/**
 * Template part for displaying pizza content in page-home.php
 *
 * @link https://developer.wordpress.org/themes/basics/template-hierarchy/
 *
 * @package JJs_Pizza
 */

// Variables

$pizza_hero     = get_field('pizza_hero');
$pizza_custom   = get_field('pizza_custom');

$pizza_args = array(
    'posts_per_page'    => 50, 
    'post_type'         => 'food',
    'category_name'     => 'pizza',
    'orderby'           => 'post_id',
    'order'             => 'ASC'
);


?>

<!-- Pizza Section -->
<section class="menu-pizza mt-4" id="pizza">
        <div class="row no-gutters p-3">
            <div class="col">
                <?php if( !empty($pizza_hero) ) : ?>
                    <?php echo($pizza_hero); ?>                 
                <?php endif; ?>
            </div>
        </div>
        
        <div class="row p-3 justify-content-center">
            <?php if ( !empty($pizza_custom) ) : ?>
                <div class="col-lg-4 col-sm-6 col-xs-12 custom-menu pt-2">
                    <?php echo($pizza_custom);?>
                </div>
            <?php endif; ?>
        
        <?php $loop = new WP_Query($pizza_args);?>
        <?php while( $loop ->have_posts() ) : $loop->the_post(); ?>
        
        <div class="col-lg-4 col-sm-6 col-xs-12 menu p-4">
            <div class="row">
                <div class="col d-flex justify-content-center">
                    <?php if (get_field('image')):?>
                        <img src=”<?php the_field('image'); ?>" class="img-fluid">
                    <?php endif; ?>
                </div>  
            </div>
            <div class="row">
                <div class="col">
                    <h3 class="text-center"><?php the_title();?></h3>
                    
                    <p class="text-center mx-auto">
                    
                    <?php
                        $labels = get_field(‘labels’);
                        if( $labels && in_array(‘vegetarian’, $labels) ) {
                            echo(‘<i class="fas fa-leaf"></i>');
                            }
                        ?>
                        
                        <?php
                        $labels = get_field(‘labels’);
                        if( $labels && in_array(‘spicy’, $labels) ) {
                            echo(‘<i class="fas fa-fire"></i>');
                            }
                        ?>
                    </p>
                    
                    <?php if (get_field('description')):?>
                        <p class="text-center"><em><?php the_field('description');?></em></p>
                    <?php endif; ?>
                    
                </div>  
            </div>
            
        </div>
        
        <?php endwhile;?>
    </div>      
</section><!-- End Pizza Section -->

我还将到目前为止的代码上传到 https://demo.jjs-pizza.com/ 的实时站点,但到目前为止,我编码的唯一动态部分是比萨饼和比萨饼卷部分,因此您可以了解问题。

提前感谢您的帮助!如果情况更糟,我将修复模板部分并在同一页面上工作,但为了更清晰的代码,我希望有一个解决方案。

您在模板中调用了 WP_Query,之后没有重置 post 数据。我怀疑这与此有关,尽管在不查看所有代码的情况下很难判断字段是如何设置的,在哪些页面上,以及它们如何协同工作。

如果我们看看代码中发生了什么:

  1. 首先,您的 content-pizza.php 模板部分被执行
  2. 获取当前 post 的 pizza_heropizza_custom 字段(大概设置在主页上?)
  3. 然后它执行自定义 WP_Query 并循环遍历其中的所有 posts
  4. 接下来调用您的 content-rolls.php 模板部分。假设是与 content-pizza...
  5. 相同的代码
  6. 然后获取当前 post 的 pizza_heropizza_custom 字段。然而,因为代码在 WP_Query 之后没有重置 post 数据,当前 post 仍然是那个循环 [=45] 中的最后一个 post =].

我不确定 post 应该在什么上调用 get_field,但我怀疑它不是仍然设置为当前的 post post自定义查询后。

完成自定义循环后,您可以在完成该查询的循环后调用 wp_reset_postdata 重置 post 数据,如下所示:

<?php $loop = new WP_Query($pizza_args);?>
<?php while( $loop ->have_posts() ) : $loop->the_post(); ?>

// do stuff...

<?php endwhile;?>
<?php wp_reset_postdata();    /* RESET POST DATA HERE */    ?>

您可以了解更多关于 wp_reset_postdata in the WP Code Reference for it

尝试在每个循环后添加 wp_reset_query()!您需要销毁现有查询以 运行 一个新查询。