在我的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; ?>
示例图,因为我不善于通过文本解释。
目前,我已在公司编辑页面(directory_listing)上设置了关系字段。它在执行以下操作时有效: 1)此商家信息的相关帖子 - &gt;选择一个帖子 - &gt;发布 - &gt;现在显示商家信息页面上的列表。示例:http://bit.ly/1vwydDl(页面底部)
2)我想从POST编辑页面选择一个会显示帖子的商家。我可以通过ACF将该字段放在那里没问题但是让它实际显示我无法弄清楚的结果。
答案 0 :(得分:11)
get_field()有三个参数:
$field_name
:要检索的字段的名称。例如&#34; page_content&#34; (所需的)$post_id
:输入您的值的特定帖子ID。 默认为当前帖子ID(不是必需的)。这也可以是选项/分类/用户/等 $format_value
如果您只关心抓取特定帖子(您知道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]
,或任何其他组合以从其他帖子中导入字段值。