Mostrare tutti i valori di un campo personalizzato creato con ACF su una pagina
Sto utilizzando Advanced Custom Fields / ACF per creare campi personalizzati. Uno di questi è un elenco di caselle di controllo che mostrano alcune opzioni (opzione1, opzione2, opzione3...).
Ora voglio visualizzare tutte le opzioni di questo campo su una pagina separata nel frontend in questo modo:
Opzioni:
- opzione 1
- opzione 2
- opzione 3
- ...
Come posso recuperare tutte le opzioni con le relative chiavi da ACF?
La funzione get_field_object
di ACF può essere utilizzata per ottenere informazioni e opzioni per un campo specifico.
Innanzitutto, è necessario avere la chiave del campo specifico che si desidera visualizzare. Durante la modifica di un gruppo di campi, fare clic sulla scheda delle opzioni schermo nella parte superiore della pagina. Dovrebbe essere visibile un'opzione per attivare la visualizzazione della chiave del campo (è nascosta per impostazione predefinita per risparmiare spazio):
Una volta ottenuta la chiave, è possibile caricare l'oggetto del campo e visualizzarne i valori:
$field_key = "field_5039a99716d1d";
$field = get_field_object($field_key);
if( $field )
{
echo '<select name="' . $field['key'] . '">';
foreach( $field['choices'] as $k => $v )
{
echo '<option value="' . $k . '">' . $v . '</option>';
}
echo '</select>';
}

Sarebbe bello se potessimo fare riferimento al nome, con la stessa facilità con cui usiamo la chiave. In questo modo, se avessimo questo in un plugin e dovessimo testarlo su un'altra istanza di WordPress con ACF abilitato, non dovremmo cercare la chiave e modificarla di nuovo solo perché ci troviamo nell'ambiente B.

Se stai cercando di visualizzare qualcosa se una checkbox è stata selezionata, utilizza:
<?php if(in_array('news', get_field('checkbox') )): ?>
<h1>News è stata selezionata!</h1>
<?php endif; ?>
Se invece vuoi semplicemente mostrare una lista delle opzioni selezionate, usa questo codice:
<p>Categorie: <?php get_field('checkbox'); ?></p>
Questo ti restituirà un array di valori che puoi gestire con un'istruzione foreach
. Usando the_field('checkbox')
otterrai una stringa separata da virgole delle opzioni che potrai successivamente dividere.
Ti suggerisco inoltre di visitare il sito di ACF e consultare la documentazione. La maggior parte delle domande di questo tipo troverà risposta lì con dettagli sufficienti, e lo sviluppatore è attivo anche nei forum di supporto.
MODIFICA: Se vuoi ottenere la lista delle opzioni disponibili da visualizzare in una pagina per generare una query dinamica, ho proprio quello che fa al caso tuo. Questo è un pezzo di codice che ho sviluppato ieri per estrarre una lista di valori meta da una determinata chiave di campo personalizzato (usando ACF). L'ho reso abbastanza generico per te. C'è un altro pezzo di JS per gestire la richiesta ajax, e una parte piuttosto complessa di PHP che restituisce i post risultanti. Non posso riscrivere quelli - il JS è una chiamata/risposta ajax standard di WP, e il PHP è un insieme di controlli condizionali per i 12 diversi campi ACF che stiamo visualizzando (2 dei quali sono ripetitori). Le basi sono questo codice qui, il pulsante onClick
chiama la funzione ajax in un file JS separato, e il PHP per la funzione ajax stessa imposta essenzialmente un array di argomenti per la query, uno dei quali è $selectedOption
o $_POST['option']
come meta_value. Questo viene passato a un new WP_Query( $args );
, che viene poi utilizzato in un loop, il cui output viene restituito al js tramite add_action('wp_ajax_the_ajax_hook', 'fetch_option_list');
e add_action( 'wp_ajax_nopriv_the_ajax_hook', 'fetch_option_list' ); //per utenti non loggati
.
// Ottieni la lista di meta_values per una data meta_key e post_type (page, post, custom post type)
function meta_list($key = '', $type = '', $status = 'publish'){
global $wpdb;
$r = $wpdb->get_col($wpdb->prepare( "
SELECT DISTINCT pm.meta_value FROM {$wpdb->postmeta} pm
LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id
WHERE pm.meta_key = '%s'
AND p.post_status = '%s'
AND p.post_type = '%s'
ORDER BY pm.meta_value ASC", $key, $status, $type));
return $r;
}
// AGGIUNGI AD ESEMPIO UN FORM ALLA PAGINA
function meta_ajax_frontend(){
$formlist = meta_list('metakey', 'posttype');
echo '<form id="optionSelect">';
echo '<select id="optionList" name="optionList">';
foreach($formlist as $fl => $val) {
echo '<option>' . $val . '</option>';
}
echo '</select>';
echo '<input name="action" type="hidden" value="the_ajax_hook" />
<input id="submit_button" value = "Cerca" type="button" onClick="fetch_meta();" />
</form>
<div id="meta_list">
Seleziona un'opzione dalla lista
</div>';
}

Mm, se faccio così, visualizzerò le opzioni assegnate al "post", quello che mi serve è mostrare tutte le opzioni in una "pagina" come un elenco completo delle opzioni.

Mi chiedo perché tu abbia bisogno di mostrare la lista delle opzioni del backend sul frontend. Vuoi semplicemente visualizzare la lista delle opzioni con gli elementi selezionati nell'admin? Se stai cercando di usarlo come parte di un modulo (permettendo all'utente di modificare i dati selezionati), questo non è il plugin o il metodo giusto per farlo. Tuttavia, se vuoi la lista delle opzioni da usare come pre-filtro per riscrivere la query, potrei avere proprio quello che fa per te. Modificherò presto il mio post sopra con quel codice.

Ciao, sono Bob con un altro account, ho bisogno delle opzioni del backend per creare una sorta di "menu" con esse. Penso che il tuo codice recuperi i post e le opzioni assegnate a loro. A me serve solo la lista delle opzioni come quella che appare nel backend quando crei un post. Continuerò a lavorare con il tuo codice per vedere se riesco a capire qualcosa. Grazie @SickHippie

No, estrae l'elenco delle opzioni che sono state selezionate da quella checkbox - vale a dire, dice "ecco la checkbox, ci sono post a cui sono stati assegnati i valori 'opzione 1', 'opzione 2', 'opzione 4' e così via. Estrae letteralmente solo l'elenco dei meta_value in base a quel meta_key. Ne avevo bisogno per una lista dinamica, ma se crei un post bozza con tutte le checkbox selezionate, estrae tutte le opzioni in un array per te. È quell'array che sto usando nel foreach
per eseguire il loop. Le funzioni successive portano l'elenco dei post via ajax, ma ho omesso quella parte.
