ACF relationship fields-получение значений полей из другого типа post
на странице "Мои сообщения" (обычный тип записи) я настроил поле отношений ACF. Внутри этого я могу выбрать название компании, которые находятся под типом post directory_listings.
теперь у меня есть следующий код на странице списков каталогов, и поэтому использование просто 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) связанные сообщения в этом бизнес-листинге - > выберите сообщение - > опубликовать - > теперь отображает список на странице бизнес-листинга. Пример здесь:http://bit.ly/1vwydDl (внизу страницы)
2) я хотел бы на странице редактирования сообщения выбрать бизнес, на котором будут отображаться сообщения. Я могу поместить поле туда через ACF без проблем, но заставить его фактически отображать результаты, которые я не могу понять.
3 ответов
Справочная Информация:
get_field () имеет три параметра:
-
$field_name
: имя поля, которое необходимо получить. например, "page_content" (обязательно) -
$post_id
: конкретный идентификатор записи, в который было введено ваше значение. по умолчанию текущий post ID (не требуется). Это также может быть options / taxonomies / users / etc $format_value
если бы вы только беспокоились при захвате определенного поста (из которого вы знали идентификатор) ключ будет вторым параметром ($post_id
). В ACF нет ничего волшебного. Довольно просто:meta_value
(т. е. каталог, к которому привязан пост) сохраняется к каждому сообщению (прикрепленному к этому сообщению $post_id
).
однако в вашем случае мы не знаем идентификатор сообщения(сообщений), которое мы хотим получить.
устранение:
если мы объясним, что вы хотите сделать в простом предложении, это предложение будет выглядеть примерно так:
показать / получить сообщения на
directory_listings
(пользовательский тип записи) страница, которая имеетmeta_value
что указывает на эту страницу.
очевидно, вы не можете использовать get_field()
, потому что ваша проблема не имеет ничего общего с "получением поле."Скорее, вам нужно" найти сообщения, которые имеют конкретное поле.- У ACF есть отличная документация по этому.
к счастью для вас, WordPress поставляется с удивительным классом под названием WP_Query, и аналогично удивительная функция под названием get_posts (). Поэтому, оглядываясь на наше предложение выше и переводя его в функцию, мы хотим:get_posts()
здесь meta_key
есть value
текущего $post_id
.
или, более конкретно, на ваш 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;
Если это настраиваемое поле, которое вы ищете в этом запросе, вы можете сделать это следующим образом:
<?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; ?>
если я правильно понял, это та же проблема, что и у меня.
В моем случае я предпочитал работать с шорткодами.
Используя [acf field="person"]
С полем, являющимся relationshipt, только дал мне идентификатор человека, но я не смог получить доступ к их полям.
С другой стороны, используя [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' );
размещение этого в функции.php файл позволяет использовать шорткод
[import person last_name]
например, или любая другая комбинация для импорта значений полей из других сообщений.