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 数据。我怀疑这与此有关,尽管在不查看所有代码的情况下很难判断字段是如何设置的,在哪些页面上,以及它们如何协同工作。
如果我们看看代码中发生了什么:
- 首先,您的 content-pizza.php 模板部分被执行
- 获取当前 post 的
pizza_hero
和 pizza_custom
字段(大概设置在主页上?)
- 然后它执行自定义
WP_Query
并循环遍历其中的所有 posts
- 接下来调用您的 content-rolls.php 模板部分。假设是与 content-pizza...
相同的代码
- 然后获取当前 post 的
pizza_hero
和 pizza_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_query()!您需要销毁现有查询以 运行 一个新查询。
我正在使用 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 数据。我怀疑这与此有关,尽管在不查看所有代码的情况下很难判断字段是如何设置的,在哪些页面上,以及它们如何协同工作。
如果我们看看代码中发生了什么:
- 首先,您的 content-pizza.php 模板部分被执行
- 获取当前 post 的
pizza_hero
和pizza_custom
字段(大概设置在主页上?) - 然后它执行自定义
WP_Query
并循环遍历其中的所有 posts - 接下来调用您的 content-rolls.php 模板部分。假设是与 content-pizza... 相同的代码
- 然后获取当前 post 的
pizza_hero
和pizza_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_query()!您需要销毁现有查询以 运行 一个新查询。