在函数范围

时间:2017-10-19 19:30:41

标签: php wordpress loops templates

我有一种情况需要使用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>

1 个答案:

答案 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 */
}