acf-to-rest-api
acf-to-rest-api copied to clipboard
Filtro múltiplo com campos array
Fala Aires, tudo bem?
Primeiro parabéns e obrigado pelo plug-in cara, é uma mão na roda sem tamanho! Vem me salvando nos últimos dias que você não faz ideia, obrigado mesmo.
Agora o problema que eu tentei retratar em outro tópico pra evitar de abrir um tópico! Mas acho melhor tentar por aqui mesmo, as vezes só estou errando o caminho.
Eu tenho alguns campos no ACF para serem filtrados: ddd, idade, dispositivo e sexo. O campo DDD é um array porque é de múltipla escolha, já os outros são simples.
Eu peguei um exemplo de função em outro tópico e consegui chegar em algum lugar com essa URL: http://localhost/meusite/wp-json/acf/posts/?acaodapergunta1=nothing&sexo=h
Com o código:
add_filter( 'rest_post_query', function( $args ) {
$args['meta_query'] = array(
array(
'key' => 'acaodapergunta1',
'value' => esc_sql( $_GET['acaodapergunta1'] ),
),
array(
'key' => 'sexo',
'value' => esc_sql( $_GET['sexo'] ),
)
);
return $args;
} );
Aqui eu consigo filtrar os resultados, mas só retorna quando eu uso as duas variáveis na URL, se eu tentar passar apenas acaodapergunta1 ou apenas sexo, não retorna nada. Até ai tudo bem, porque sempre vou precisar filtrar várias coisas ao mesmo tempo.
O meu maior problema está no campo DDD, quando eu tento adicionar ele, não consigo filtrar. Acredito que seja porque ele é um array, ou seja, configurei no ACF ele como múltipla escolha, então o response é:
[...]
"ddd": [ "11", "12", "13", "14" ],
[...]
O que eu queria fazer é ter a opção de filtrar assim na URL: http://localhost/meusite/wp-json/acf/posts/?acaodapergunta1=nothing&sexo=h&ddd=11,13
Existe algum jeito? Fui longe de mais?
Valeu,
Fala @danilopaulinodasilva, blz?
O código abaixo resolverá esse problema, pois quando os parâmetros são "sanitizados", eles são identificados como integer
, pois ainda não há uma coleção para os argumentos ao registrar um endpoint, dizendo que eles deverão ser um array
.
add_action( 'parse_tax_query', function( $query ) {
$is_acf = strpos( $_SERVER['REQUEST_URI'], 'wp-json/acf' ) !== false;
if ( $is_acf && ! empty( $query->tax_query ) ) {
foreach ( array( 'queried_terms', 'queries' ) as $prop ) {
foreach ( $query->tax_query->{ $prop } as &$q ) {
$tmp = array();
foreach ( $q['terms'] as &$v ) {
$q['terms'] = explode( ',', $v );
}
}
}
}
} );
O que precisamos: https://github.com/WP-API/WP-API/blob/develop/lib/endpoints/class-wp-rest-posts-controller.php#L45
Como está atualmente: https://github.com/airesvsg/acf-to-rest-api/blob/master/v3/lib/endpoints/class-acf-to-rest-api-controller.php#L28
Valeu,
Aires,
Obrigado pelo código, mas se eu não tiver feito nada errado, ainda não consigo filtrar pelo campo que seja um array()
.
A principio o código não surtiu efeito, porque quando eu tento usar a função add_filter( 'rest_post_query', function( $args ) { ... }
eu só consigo fazer filtro passando o key e value na URL, sem isso ele não retorna nada além de []
.
Mesmo eu colocando a função que você passou, ele continua retornando todos os dados, sem filtrar.
Abraço,
Have this been solved anywhere...?