ACF关系字段 - 来自其他帖子类型的get_field值

时间:2014-12-10 14:07:29

标签: wordpress advanced-custom-fields

在我的POSTS页面(常规帖子类型)中,我设置了一个ACF关系字段。在此我可以选择公司名称,这些名称都在directory_listings的post类型下。

现在,我在目录列表页面上有以下代码,因此使用简单的get_field不起作用,因为这些值不在此页面上,而是在POST类型的其他位置。

不确定如何获取信息。

DIRECTORY_LISTINGS帖子类型下的其中一个网页上的代码:

$posts = get_field('related_articles');

if( $posts ): ?>
    <ul>
    <?php foreach( $posts as $post): // variable must be called $post (IMPORTANT) ?>
        <?php setup_postdata($post); ?>
        <li>
            <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
        </li>
    <?php endforeach; ?>
    </ul>
    <?php wp_reset_postdata(); // IMPORTANT - reset the $post object so the rest of the page works correctly ?>
<?php endif; ?>

示例图,因为我不善于通过文本解释。 enter image description here

目前,我已在公司编辑页面(directory_listing)上设置了关系字段。它在执行以下操作时有效: 1)此商家信息的相关帖子 - &gt;选择一个帖子 - &gt;发布 - &gt;现在显示商家信息页面上的列表。示例:http://bit.ly/1vwydDl(页面底部)

2)我想从POST编辑页面选择一个会显示帖子的商家。我可以通过ACF将该字段放在那里没问题但是让它实际显示我无法弄清楚的结果。

3 个答案:

答案 0 :(得分:11)

背景资料:

get_field()有三个参数:

  1. $field_name:要检索的字段的名称。例如&#34; page_content&#34; (所需的)
  2. $post_id输入您的值的特定帖子ID。 默认为当前帖子ID(不是必需的)。这也可以是选项/分类/用户/等
  3. $format_value
  4. 如果您只关心抓取特定帖子(您知道ID),那么密钥将是第二个参数($post_id)。 ACF并没有什么神奇之处。很简单:meta_value(即列出帖子的目录)将保存到每个帖子(附在该帖子上$post_id)。

    但是,在您的情况下,我们不知道我们想要获得的帖子的ID。

    解决方案:

    如果我们用简单的句子解释你想要做什么,那句话看起来像是:

      

    directory_listings(自定义帖子类型)页面上显示/获取帖子,其中meta_value指向该页面。

    显然,你不能使用get_field(),因为你的问题与&#34;获得一个字段无关。&#34;相反,您需要找到具有特定字段的帖子。&#34; ACF有great documentation on this

    幸运的是,WordPress附带了一个名为WP_Query的强大类,以及一个名为get_posts()的类似功能强大的类。回顾上面的句子并将其翻译成函数,我们希望:get_posts() meta_key的当前value $post_id。{/ p>

    或者,更具体地说,在您的directory_listings页面上,您有以下问题:

    $related_articles = get_posts(array(
        'post_type' => 'post',
        'meta_query' => array(
            array(
                'key' => 'related_articles', // name of custom field
                'value' => '"' . get_the_ID() . '"',
                'compare' => 'LIKE'
            )
        )
    ));
    
    if( $related_articles ): 
        foreach( $related_articles as $article ): 
    
        // Do something to display the articles. Each article is a WP_Post object.
        // Example:
    
        echo $article->post_title;  // The post title
        echo $article->post_excerpt;  // The excerpt
        echo get_the_post_thumbnail( $article->ID );  // The thumbnail
    
        endforeach;
    endif;
    

答案 1 :(得分:0)

如果它是您在该查询中寻找的自定义字段,那么您可以这样做:

<?php
$posts = get_field('related_articles');

if( $posts ): ?>
    <ul>
    <?php foreach( $posts as $post): // variable must be called $post (IMPORTANT) ?>
        <?php setup_postdata($post); ?>
        <li>
            <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
            <?php the_field('your_custom_field',$post); ?>
        </li>
    <?php endforeach; ?>
    </ul>
    <?php wp_reset_postdata(); // IMPORTANT - reset the $post object so the rest of the page works correctly ?>
<?php endif; ?>

答案 2 :(得分:0)

如果我正确理解了这一点,那么这与我遇到的问题是相同的。 就我而言,我更喜欢使用短代码。 将[acf field="person"]用作关系人只能使用该人的ID,但无法访问他们的字段。 另一方面,使用[acf field="last_name", post_id=[acf field="person"](这是一个理想的解决方案)将不起作用,因为wordpress解析器不允许嵌套的短代码。

这就是为什么我提出了这个非常小的php解决方案:

function import_cf_from_cpt( $atts ) {
    // import custom fields from other custom post types that are connected via a relationship to the calling custom post type
    // shortcode: [import <field from calling CPT of type relationship> <field name from field from other CPT>]
    // ex [import person last_name] --> Doe

    $postID = do_shortcode("[acf field={$atts[0]}]");
    // we use the first attribute to get the ID of the object
    $postField = get_field($atts[1], $postID);
    // next, using the ID we look for the field of the second attribute.
return $postField;
}
add_shortcode( 'import', 'import_cf_from_cpt' );

将其放置在functions.php文件中允许使用简码

例如

[import person last_name],或任何其他组合以从其他帖子中导入字段值。