我有一种情况需要使用foreach遍历The Loop之外的帖子。
以下循环工作正常,但是,当我将几乎相同的代码迁移到函数中(以保持代码DRY)时,会出现问题:模板代码在返回时重复某些$ post元素(如缩略图,标题等)期待其他$ post元素的信息(例如摘录)。
这里显然有一些我遗漏或误解的关于如何在函数或模板代码中使用$ post,但是,我无法弄明白这一点。
任何澄清都会很棒。
原始代码:
$posts = get_field( 'featured_projects', 'user_'.$post->post_author );
if( $posts ){
$current_index = 0;
$grid_columns = 3;
foreach ($posts as $post){
if( 0 === ( $current_index ) % $grid_columns ){
echo '<div class="row archive-grid" data-equalizer>';
}
setup_postdata($post);
get_template_part( 'parts/loop', 'custom-grid' );
if( 0 === ( $current_index + 1 ) % $grid_columns
|| ( $current_index + 1 ) === 3 ){
echo '</div>';
}
$current_index++;
}
wp_reset_postdata();
}
重构为功能:
function get_grid(){
$posts = get_field( 'featured_projects', 'user_'.get_post()->post_author );
if( $posts ){
$current_index = 0;
$grid_columns = 3;
foreach ($posts as $post){
if( 0 === ( $current_index ) % $grid_columns ){
echo '<div class="row archive-grid" data-equalizer>';
}
setup_postdata($post);
get_template_part( 'parts/loop', 'custom-grid' );
if( 0 === ( $current_index + 1 ) % $grid_columns
|| ( $current_index + 1 ) === 3 ){
echo '</div>';
}
$current_index++;
}
wp_reset_postdata();
}
}
循环自定义网格模板代码
<div class="large-4 medium-4 columns panel" data-equalizer-watch>
<article id="post-<?php the_ID(); ?>" <?php post_class(''); ?>
role="article">
<?php if( has_post_thumbnail() ): ?>
<section class="archive-grid featured-image" itemprop="articleBody" style="background-image: url('<?php
echo esc_url( get_the_post_thumbnail_url($post->ID, 'medium') );
?>');">
</section>
<?php endif; ?>
<header class="article-header">
<h3 class="title">
<a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></h3>
<?php get_template_part( 'parts/content', 'byline' ); ?>
</header>
<section class="entry-content" itemprop="articleBody">
<?php the_excerpt(); ?>
</section>
答案 0 :(得分:1)
当循环在函数内部时,其他函数不会收到您期望的$post
。仅$post
变量&#34;存在&#34;在那个功能里面。
解决问题的一种简单方法是将$post
变量放在全局范围内:
function get_grid(){
global $post;
$posts = get_field( 'featured_projects', 'user_'.get_post()->post_author );
/* all the other code that works fine outside
a function should work fine inside too now */
}