Suporte » Plugins » Como “espelhar” dados com ACF

  • Resolvido amandadiaspais

    (@amandadiaspais)


    Oi gente!

    Como fazer para o Custom Field Personalizado replicar (espelhar) as informações?
    Por exemplo: criei um campo em um post que com um “repeater” é possível cadastrar diversos dados. Tais dados aparecem no frontend direitinho, isso eu configurei certinho (viva!!). Entretanto, gostaria de expor tais informações como numa lista geral, à parte deste post só que apresentado o que foi cadastrado em cada repeater no post.
    Como pode acontecer com um calendário, por exemplo, poder cadastrar várias informações por dia e que elas sejam “refletidas” numa lista geral de tudo que foi cadastrado em todos os dias no mês.

    Alguém consegue me ajudar com isso por favor? Desde já, agradeço. 🙂

    • Este tópico foi modificado 7 anos, 6 meses atrás por amandadiaspais.
Visualizando 12 respostas - 1 até 12 (de um total de 12)
  • Moderador Allyson Souza

    (@allysonsouza)

    Olá @amandadiaspais,

    Você pode utilizar a função get_post_meta() do WordPress. Ela irá retornar os dados salvos em um campo personalizado.

    https://developer.wordpress.org/reference/functions/get_post_meta/

    Por exemplo:
    $repeater = get_post_meta( get_the_ID(), 'fieldname', true );

    Mas enquanto escrevia vi que marcou com a tag ACF. O ACF possui uma função própria, get_field(), que pode utilizar. Na documentação eles possuem vários exemplos.
    https://www.advancedcustomfields.com/resources/get_field/

    Criador do tópico amandadiaspais

    (@amandadiaspais)

    Oi Allyson!

    Muito obrigada pela resposta!!

    Mas foi isso mesmo que fiz. Inclusive os meus “dados específicos” aparecem normalmente com o get_field(), só que gostaria de replicar ou espelhar esses “dados específicos” em um outro local e mesmo chamando com get_field() não aparece informação alguma nesse outro local. É como se não houvesse nada postado, sendo que há e em cada “dados específicos” tudo que foi cadastrado aparece lá normalmente.

    Por isso exemplifiquei com o calendário, mas acho que fica melhor dizer como uma agenda. Onde é possível cadastrar informações dela diariamente (isso eu consigo fazer e já está funcionando), mas eu gostaria que o relatório mensal ou geral (vamos dizer assim) expusesse tudo que houve cadastrado durante todos os dias do mês. Suponha que no dia 1 tenha sido cadastrado 10 informações e em todos os outros 29 dias, 5 informações. Ao final do mês, no relatório geral, apareceriam as 155 informações. São essas 155 informações (do exemplo) que não aparecem dado algum.

    Abaixo código desse tal relatório geral ao qual me refiro e que não gera dado algum:

    <?php if ( have_rows('follow_up') ):
    	while ( have_rows('follow_up') ): the_row();?>
    		<?php $date = DateTime::createFromFormat('Ymd', get_sub_field('data_de_atualização'));
    			echo $date->format('d/m/Y'); ?>
    		<?php the_sub_field('n_do_processo'); ?>
    								
    	<?php endwhile;
    endif; ?>

    Código este que é o mesmo dos dados cadastrados diariamente e que funciona perfeitamente. 🙂

    Peço desculpa pelo texto gigantesco, mas é que quero explicar que o caso é simples, mas que eu não tenho sucesso.

    Agradeço o retorno novamente, viu?

    Boa semana! 🙂

    Moderador Allyson Souza

    (@allysonsouza)

    Oi @amandadiaspais,

    Não se preocupe com o tamanho do texto, é bom detalhar bem a dúvida mesmo. Não conhecia esse método do próprio ACF de iterar sobre os dados de um repeater, dei uma olhada na documentação, e parece que o have_rows() pode receber dois parâmetros: $field_name e $post_id. Acredito que se você está fora da single do post/página que possui esse campo associado, você deva passar o id do post em questão, do qual deseja pegar os dados desse repeater (foi o que entendi quando você disse “exibir em um outro local”).

    Creio que ficaria mais ou menos:

    //Considerando um post com ID hipotético de 10
    <?php if ( have_rows('follow_up', 10) ):
    	while ( have_rows('follow_up', 10) ): the_row();?>
    		<?php $date = DateTime::createFromFormat('Ymd', get_sub_field('data_de_atualização'));
    			echo $date->format('d/m/Y'); ?>
    		<?php the_sub_field('n_do_processo'); ?>
    								
    	<?php endwhile;
    endif; ?>

    Seria isso?

    • Esta resposta foi modificada 7 anos, 6 meses atrás por Allyson Souza.
    Criador do tópico amandadiaspais

    (@amandadiaspais)

    Oi Alysson!

    O ACF é maravilhoso, eu que sou jumenta (rsrs)! É possível fazer o mundo com ele. Tem gente que criou até “criadores de sites” com esse plugin.

    Você entendeu direitinho meu caso (eba!). Mas como fazer para que isso seja refletido automaticamente para diversos posts, por exemplo? Porque no seu exemplo só apareceria informações do post cujo ID é 10, certo? Mas eu gostaria que isso fosse refletido para todos IDs que contemplem o repeater. Como generalizar?

    Muitíssimo obrigada novamente! Fiquei muito feliz que tenha compreendido minha ideia rs 🙂

    Moderador Allyson Souza

    (@allysonsouza)

    @amandadiaspais, ai você pode utilizar o loop do WordPress, construir uma consulta para todos os posts, percorrer cada post e para cada um utilizar o código acima, passando o ID do post corrente, para exibir os campos do repeater.

    Exemplo:

    $args = array(
    	'post_type' => 'post', //consultaremos posts
            'posts_per_page' => -1 //utilizando -1 retornamos todos os posts
    );
    $query = new WP_Query( $args );
    
    if( $query->have_posts() ) :
            while( $query->have_posts() ) :
                    $query->the_post();
    
                    if ( have_rows('follow_up', get_the_ID() ) ):
    	                while ( have_rows('follow_up', get_the_ID() ) ) : the_row();
    
    		        the_sub_field('n_do_processo');
    								
    	                endwhile;
                    endif;
            endwhile;
    endif;
    Criador do tópico amandadiaspais

    (@amandadiaspais)

    Obrigaduuuu, Allyson!!

    Creio que assim já funcione!
    Vou testar e te conto.

    Obrigada mesmo pelo auxilio e colaboração 🙂

    Criador do tópico amandadiaspais

    (@amandadiaspais)

    @allysonsouza Não funcionou para o meu caso, infelizmente. A lógica é essa, deveria ser, mas não aparece dado algum.

    Tentei de diversas formas, mas não foi. Creio que seja defeito da minha limitação em conhecimento da área.
    Na verdade o post type é o mesmo, tanto para o repeater quanto onde quero que apareça as informações gerais. Pensei então em utilizar o ID do custom post em que o repeater em questão está inserido. Ficou assim:

    <?php 
    	$args = array(
    		'id' => 'acf_phases',
    		'name' => 'phases',
    					
    		//'post_type' => 'psp_project', //consultaremos posts
    		'posts_per_page' => -1 //utilizando -1 retornamos todos os posts
    					
    		);
    	$query = new WP_Query( $args );
    
    	if( $query->have_posts() ) :
    	while( $query->have_posts() ) :
    	$query->the_post();
    
    	if ( have_rows('follow_up', get_the_ID() ) ):
    	while ( have_rows('follow_up', get_the_ID() ) ) : the_row();
    
    		the_sub_field('n_do_processo');
    		the_sub_field('unidade');
    		the_sub_field('situacao');
                    the_sub_field('detalhamento_kallas');
    												
           endwhile;
           endif;
           endwhile;
           endif;				
    ?>

    Ainda assim é como se houvesse dados cadastrados algum.
    Vou enviar o print do projeto, de repente consigo me explicar melhor:

    Repeaters recolhem dados com sucesso

    Aqui apareceriam todos os dados. Visualização geral.

    Cada “Follow up”, como denominei, fica dentro de cada “Fase” de um post, post este que também quero expor o “Follow up Geral” que é onde deveria constar tudo que já foi cadastrado nos “Follow ups”, mas que, por algum motivo, não estou conseguindo chamá-los.

    Segui uma linha certa ao tentar chamar o id do custom post (“Fase”) para que ele entenda que quero chamar todos os “Follow up”?

    Obrigada novamente!

    Att,
    Amanda

    • Esta resposta foi modificada 7 anos, 6 meses atrás por amandadiaspais.
    Moderador Allyson Souza

    (@allysonsouza)

    Olá @amandadiaspais,

    Realmente o problema parece estar na construção da sua consulta ao banco de dados. A WP_Query não possui um parâmetro 'id' (mas sim 'p', onde espera receber um número inteiro): https://codex.wordpress.org/Class_Reference/WP_Query#Post_.26_Page_Parameters

    Você passou um slug como parâmetro. Para buscar por slug, o parâmetro correto seria o ‘name' => 'acf_phases', considerando que acf_phases seria o slug do post, mas pelo que entendi, não é. Você tentou buscar o conteúdo dos campos diretamente, mas não é bem o melhor modo de se fazer isso.

    No momento não consigo detalhar melhor, mas basicamente o que creio que deva fazer é:

    1. Realizar uma consulta WP_Query para percorrer todos os posts do tipo desejado
    2. No loop, ao percorrer cada um dos posts retornados pelo WP_Query, realizar o sub loop para retornar os dados de cada campo do repeater, com a função the_sub_field() do ACF.

    Se não estiver muito claro o uso do WP_Query, sugiro praticar, pegar os exemplos da documentação e testar um pouco que dados são retornados.

    Criador do tópico amandadiaspais

    (@amandadiaspais)

    Ok, @allysonsouza!

    Muito obrigada, viu?
    Vou ver o que consigo fazer.

    Abraço!

    Criador do tópico amandadiaspais

    (@amandadiaspais)

    Oi, @allysonsouza!

    Consegui!!
    A questão é que era um repeater dentro de outro então era necessário utilizar uma estrutura assim:

    <?php if ( have_rows('phases') ):
    	while ( have_rows('phases') ): the_row(); ?>	
    						
    	<?php if ( have_rows('follow_up') ):
    		while ( have_rows('follow_up') ): the_row();?>
    						
    	<?php $date = DateTime::createFromFormat('Ymd', get_sub_field('data_de_atualização'));
    		echo $date->format('d/m/Y'); ?>
    	<?php the_sub_field('n_do_processo'); ?>
    	<?php the_sub_field('unidade'); ?>
    	<?php $date = DateTime::createFromFormat('Ymd', get_sub_field('desde'));
    		echo $date->format('d/m/Y'); ?>
    	<?php the_sub_field('situacao'); ?>
    	<?php the_sub_field('detalhamento_kallas'); ?>
    							
    	<?php endwhile;
    		endif; ?>
    <?php endwhile;
    	endif; ?>

    Então foi necessário fazer um sub repeater do repeater. Simples e lógico. Eu disse que era uma insuficiência cerebral minha. rsrs

    Muito obrigada pela colaboração! <3

    • Esta resposta foi modificada 7 anos, 6 meses atrás por amandadiaspais.
    Criador do tópico amandadiaspais

    (@amandadiaspais)

    Moderador Allyson Souza

    (@allysonsouza)

    Que bom que conseguiu resolver e que voltou para compartilhar a solução! Marcando-o como resolvido. 🙂

Visualizando 12 respostas - 1 até 12 (de um total de 12)
  • O tópico ‘Como “espelhar” dados com ACF’ está fechado para novas respostas.