在短码函数中检索高级自定义字段

时间:2015-11-12 作者:MikeiLL

我正在尝试做一些看起来应该(也可能)简单的事情:显示高级自定义字段的结果get_field() 在返回shortcode函数时调用。

在主题模板中:

$posts = get_posts(array(
    \'posts_per_page\'    => -1,
    \'post_type\'         => \'produce\',
    \'orderby\'               => \'title\',
    \'order\'                 => \'ASC\'
  ));


  foreach( $posts as $post ):

    setup_postdata( $post );

    the_title(); 
    print_r(get_field(\'produce_image\')); 
根据需要,the_title(); 显示每个自定义帖子项目的标题,以及get_field(\'produce_image\') 包含项目的图像数组。

然而,在短代码中,虽然WP_Post Objects包含在$posts 相同,the_title(); 返回调用短代码的页面的标题,以及get_field(\'produce_image\') 似乎没有返回任何内容,甚至没有返回空数组。

从中获取真实回报function_exists(\'get_field\').

整个短代码是:

<?php

function field_to_fork_produce_display( $atts ) {

  $atts = shortcode_atts(array(
    \'title\' => \'Produce\'
  ), $atts );

  $title = $atts[\'title\']; 

  /*
  $plugins_dir = plugin_dir_path( __file__ );
  $plugins_dir = str_replace("/field-to-fork/lib/", "", $plugins_dir);
  include_once($plugins_dir.\'/advanced-custom-fields/acf.php\'); 
  */    

  $result = \'<div class="col"><h2 class="text-center"><?=$title?></h2>\';

  $posts = get_posts( array(
    \'posts_per_page\'    => -1,
    \'post_type\'           => \'produce\',
    \'orderby\'                 => \'title\',
    \'order\'                   => \'ASC\'
  ));

  mz_pr($posts);

  if( $posts ): 
?>

<?php

    foreach( $posts as $post ):

      setup_postdata( $post );
      mz_pr(get_post_meta($post->ID, \'produce\', true));

?>
<?php 

      if ( has_post_thumbnail() ) { // check if the post has a Post Thumbnail assigned to it. 

        $result .=  \'<a href="<?php the_permalink(); ?>">\';
        the_post_thumbnail( \'thumb\', array( \'class\' => "img-responsive img-center"));

      }       

      $result   .=      \'</a>\';
      $result   .=      \'<h4><a href="<?php the_permalink(); ?>">\' . the_title() . \'</a></h4>\';
      $result   .=      \'<p>\' . the_excerpt() . \'</p>\';

      if ( ! function_exists( \'get_field\' ) ) {
        die(\'not there\');
      }

      mz_pr(function_exists(\'get_field\'));
      mz_pr(get_field(\'produce_image\')); 
      echo get_field(\'produce_image\');
      mz_pr("nothing to see here"); 

      $produce_thumbnail = get_field(\'produce_image\', false, false)[\'sizes\'][\'thumbnail\'];
      $result   .= \'<img src="<?=$produce_thumbnail?>" class="img-responsive field_to_fork_thumb <?php the_title(); ?>">\';
      $result   .=      \'</a>\';

    endforeach; 

    wp_reset_postdata(); 

  endif; 

  $result   .= \'</div><!-- end span 6-->\';

  return $result;
} 

?>

1 个回复
最合适的回答,由SO网友:MikeiLL 整理而成

“您必须显式地将post ID作为第二个参数传递。”–米洛

在高级自定义字段插件文件中,plugins/advanced-custom-fields/core/api.php, get_fields 具有默认值$post_id ,并调用get_field_objects, 它似乎可以运行特定的调用$wpdb->get_col($wpdb->prepare, 取决于什么$post_id 包含(is_numeric?, strpos(\'user_\')), 因此,我猜根据您从中调用它的循环的环境,它将返回不同的结果,除非$post->ID 已指定。

按照上述@Milo的规定:

get_field(\'produce_image\', $post->ID)
将为我们获取图像对象。

我想get_the_title($post->ID) 是本地Wordpress,可能工作方式类似。

跑步get_the_excerpt($post->ID) 返回警告:

get_the_excerpt was called with an argument that is deprecated since version 2.3 with no alternative available., 但只是跑步get_the_excerpt() 正在根据需要返回帖子摘录。

相关推荐

redirect if shortcode exists

WordPress初学者。我试图检查用户请求的页面中是否存在短代码,如果存在,则在用户未登录时重定向。function redirect_to_home() { if (has_shortcode(get_the_content(), \'shortcode\')) { if(!is_admin() && !is_user_logged_in()) { //redirect exit(); }