ACF if 语句在字段为空时不起作用
ACF if statement not working when field is empty
我有一个名为 hero_image
的英雄图片 ACF 字段。该字段位于我的 single.php
页面的顶部,如下所示:
<?php
/**
* The template for displaying all single posts
*
* @link https://developer.wordpress.org/themes/basics/template-hierarchy/#single-post
*
* @package sitename
*/
get_header();
?>
<?php
$post_id = get_the_ID(); // Required as outside the loop
$image = get_field('hero_image', $post_id);
if ($image) {
echo '<div class="hero">'.wp_get_attachment_image( $image, 'hero').'</div>';
}
?>
<div class="has-sidebar">
<div id="primary" class="content-area">
<main id="main" class="site-main">
<?php
while ( have_posts() ) :
the_post();
get_template_part( 'template-parts/content', get_post_type() );
the_post_navigation();
endwhile; // End of the loop.
?>
</main><!-- #main -->
</div><!-- #primary -->
<?php
get_sidebar();
get_footer();
?>
</div><!-- .has-sidebar -->
我正在使用 $post_id
变量从循环外部获取字段。图片按预期加载。
如果尚未使用该字段为 post 上传图片,我预计前端不会有任何标记。但是,我仍然看到以下内容:
<div class="hero"></div>
为什么当字段未被使用时我的 if 语句不起作用?
我进一步挖掘并发现了我的问题。
我有两个 ACF 字段 hero_image
和 thumbnail_image
。这些将显示在所有页面和 post 上,包括自定义 post 类型。
查看 header.php
文件,我发现了以下内容:
<?php
// Get post ID
$post_id = get_queried_object_id();
// Hero image
$hero = get_field('hero_image', $post_id);
$hero_url = wp_get_attachment_url( get_field('hero_image', $post_id), 'hero');
?>
<?php if ( is_single() || is_archive() ): ?>
<header id="masthead" class="site-header">
<?php else: ?>
<header id="masthead" <?php if ($hero) { echo 'class="site-header has-background" style="background:url('.$hero_url.')"'; } else { echo 'class="site-header"'; } ?>>
<?php endif; ?>
如您所见,我还在循环外使用了变量 $post_id
。这阻止了第二个 $post_id
变量通过 single.php
.
工作
我已将 header.php 中的 $post_id
重命名为 $post_id_outside_loop
。然后我通过 single.php
使用了这个变量,因为它也在循环之外。这已解决问题。
<?php
/**
* The template for displaying all single posts
*
* @link https://developer.wordpress.org/themes/basics/template-hierarchy/#single-post
*
* @package sitename
*/
get_header();
?>
<?php
// $post_id_outside_loop is set via header.php
$image = get_field('hero_image', $post_id_outside_loop);
if ($image) {
echo '<div class="hero">'.wp_get_attachment_image( $post_id_outside_loop, 'hero').'</div>';
}
?>
<div class="has-sidebar">
<div id="primary" class="content-area">
<main id="main" class="site-main">
<?php
while ( have_posts() ) :
the_post();
get_template_part( 'template-parts/content', get_post_type() );
the_post_navigation();
// If comments are open or we have at least one comment, load up the comment template.
if ( comments_open() || get_comments_number() ) :
comments_template();
endif;
endwhile; // End of the loop.
?>
</main><!-- #main -->
</div><!-- #primary -->
<?php
get_sidebar();
get_footer();
?>
</div><!-- .has-sidebar -->
我有一个名为 hero_image
的英雄图片 ACF 字段。该字段位于我的 single.php
页面的顶部,如下所示:
<?php
/**
* The template for displaying all single posts
*
* @link https://developer.wordpress.org/themes/basics/template-hierarchy/#single-post
*
* @package sitename
*/
get_header();
?>
<?php
$post_id = get_the_ID(); // Required as outside the loop
$image = get_field('hero_image', $post_id);
if ($image) {
echo '<div class="hero">'.wp_get_attachment_image( $image, 'hero').'</div>';
}
?>
<div class="has-sidebar">
<div id="primary" class="content-area">
<main id="main" class="site-main">
<?php
while ( have_posts() ) :
the_post();
get_template_part( 'template-parts/content', get_post_type() );
the_post_navigation();
endwhile; // End of the loop.
?>
</main><!-- #main -->
</div><!-- #primary -->
<?php
get_sidebar();
get_footer();
?>
</div><!-- .has-sidebar -->
我正在使用 $post_id
变量从循环外部获取字段。图片按预期加载。
如果尚未使用该字段为 post 上传图片,我预计前端不会有任何标记。但是,我仍然看到以下内容:
<div class="hero"></div>
为什么当字段未被使用时我的 if 语句不起作用?
我进一步挖掘并发现了我的问题。
我有两个 ACF 字段 hero_image
和 thumbnail_image
。这些将显示在所有页面和 post 上,包括自定义 post 类型。
查看 header.php
文件,我发现了以下内容:
<?php
// Get post ID
$post_id = get_queried_object_id();
// Hero image
$hero = get_field('hero_image', $post_id);
$hero_url = wp_get_attachment_url( get_field('hero_image', $post_id), 'hero');
?>
<?php if ( is_single() || is_archive() ): ?>
<header id="masthead" class="site-header">
<?php else: ?>
<header id="masthead" <?php if ($hero) { echo 'class="site-header has-background" style="background:url('.$hero_url.')"'; } else { echo 'class="site-header"'; } ?>>
<?php endif; ?>
如您所见,我还在循环外使用了变量 $post_id
。这阻止了第二个 $post_id
变量通过 single.php
.
我已将 header.php 中的 $post_id
重命名为 $post_id_outside_loop
。然后我通过 single.php
使用了这个变量,因为它也在循环之外。这已解决问题。
<?php
/**
* The template for displaying all single posts
*
* @link https://developer.wordpress.org/themes/basics/template-hierarchy/#single-post
*
* @package sitename
*/
get_header();
?>
<?php
// $post_id_outside_loop is set via header.php
$image = get_field('hero_image', $post_id_outside_loop);
if ($image) {
echo '<div class="hero">'.wp_get_attachment_image( $post_id_outside_loop, 'hero').'</div>';
}
?>
<div class="has-sidebar">
<div id="primary" class="content-area">
<main id="main" class="site-main">
<?php
while ( have_posts() ) :
the_post();
get_template_part( 'template-parts/content', get_post_type() );
the_post_navigation();
// If comments are open or we have at least one comment, load up the comment template.
if ( comments_open() || get_comments_number() ) :
comments_template();
endif;
endwhile; // End of the loop.
?>
</main><!-- #main -->
</div><!-- #primary -->
<?php
get_sidebar();
get_footer();
?>
</div><!-- .has-sidebar -->