Campo Relacional
O Campo Relacional é uma versão bem atrativa do campo de objetos. Com o Campo Relacional, você pode selecionar itens relacionados a uma página / posts / custom post types. É uma ótima forma de parar de usar plugins para posts relacionados, que nunca relacionam com precisão, e deixar seus usuários fazerem este relação manualmente, se preocupando apenas com o front-end.
Campos adicionais deste tipo de campo
- Formato dos dados: Especifique a forma com os valores serão retornados no front-end
- Tipo de Post: Selecione os post types que devem aparecer para serem escolhidos;
- Filtro de Taxonomia: Você pode filtrar algumas taxonomias / categorias caso seja necessário;
- Filtros: Permite adicionar um campo de busca e filtros a serem marcados pelos usuários.
- Elementos: Quais elementos irão aparecer no resultado dos boxes de seleção.
- Posts máximos: Quantidade máxima de posts permitidos. Caso você não preencha um valor máximo, o usuário poderá selecionar quantos posts quiser.
Como utilizar este campo em um template WP?
A API irá retornar um array de objetos de posts da mesma forma que a função get_posts faria, ou seus IDs, dependendo da escolha do Formato de Dados.
Loop básico (com setup_postdata)
Este exemplo mostra como carregar os posts selecionados no campo relacional e os exibir em uma lista. Este exemplo utiliza a função setup_postdata, que sobrescreve o objeto da variável global $post e permite que funções como the_title possam ser usadas. Vale lembrar que ao usar esta função, você deve resetar a $post depois para poder voltar a utilizar normalmente. Veja mais sobre isso em https://codex.wordpress.org/Template_Tags/get_posts#Reset_after_Postlists_with_offset
<?php $posts = get_field('relacao-posts'); if( $posts ): ?> <ul> <?php foreach( $posts as $post): ?> <?php setup_postdata($post); ?> <li> <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a> <span>Custom field from $post: <?php the_field('author'); ?></span> </li> <?php endforeach; ?> </ul> <?php wp_reset_postdata(); ?> <?php endif; ?>
Loop básico (sem setup_postdata)
Vejamos como fazer o mesmo do exemplo anterior, mas sem usar a função setup_postdata para sobrescrever a global $post.
<?php $posts = get_field('relacao-posts'); if( $posts ): ?> <ul> <?php foreach( $posts as $p ): // variable must NOT be called $post (IMPORTANT) ?> <li> <a href="<?php echo get_permalink( $p->ID ); ?>"><?php echo get_the_title( $p->ID ); ?></a> <span>Custom field from $post: <?php the_field('author', $p->ID); ?></span> </li> <?php endforeach; ?> </ul> <?php endif; ?>
Utilizando o WP_Query
Como vimos nas opções, é possível ter como retorno apenas o IDs de posts, ao invés do objeto de post. Com isso, você utilizar os ID’s em um WP_Query, com argumentos adicionais. Você pode ler mais sobre parâmetros do WP_Query na documentação oficial, em https://codex.wordpress.org/Class_Reference/WP_Query#Parameters.
Note que o get_field possui dos argumentos após o campo, com o valor ‘false’ sendo passado. O primeiro é para informar que o $post_id neste caso é irrelevante, e o segundo diz para o ACF não formatar o valor, retornando da forma que está salva no banco, um array de IDs.
<?php // get only first 3 results $ids = get_field('relacao-posts', false, false); $query = new WP_Query(array( 'post_type' => 'conferences', 'posts_per_page' => 3, 'post__in' => $ids, 'post_status' => 'any', 'orderby' => 'rand', )); ?>