Afișează toate valorile unui câmp personalizat creat cu ACF pe o pagină
Folosesc Advanced Custom Fields / ACF pentru a crea câmpuri personalizate. Unul dintre ele este o listă de checkbox-uri care afișează câteva opțiuni (optiunea1, optiunea2, optiunea3...).
Acum vreau să afișez toate opțiunile acestui câmp pe o pagină separată în frontend astfel:
Opțiuni:
- opțiunea 1
- opțiunea 2
- opțiunea 3
- ...
Cum pot să preiau toate opțiunile cu chei din ACF?
Funcția ACF get_field_object
poate fi utilizată pentru a obține informații și opțiuni pentru un câmp specific.
Mai întâi ai nevoie de cheia câmpului pentru câmpul specific pe care dorești să îl afișezi. Când editezi un grup de câmpuri, dă click pe fila "Opțiuni ecran" din partea de sus a paginii. Ar trebui să vezi o opțiune pentru a afișa cheia câmpului (este ascunsă implicit pentru a economisi spațiu):
Odată ce ai cheia, poți încărca obiectul câmpului și afișa valorile sale:
$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>';
}

Ar fi util dacă am putea referenția numele, la fel de ușor cum este să folosim cheia. Astfel, dacă avem acest lucru într-un plugin și ar fi nevoie să-l testăm pe o altă instanță WordPress cu ACF activat, nu va trebui să cauți cheia și să o schimbi din nou doar pentru că ești în mediul B.

Dacă încerci să afișezi ceva dacă o casetă de bifat a fost bifată, folosește:
<?php if(in_array('news', get_field('checkbox') )): ?>
<h1>News a fost bifat!</h1>
<?php endif; ?>
Dacă încerci să afișezi doar o listă cu opțiunile bifate, folosește asta:
<p>Categorii: <?php get_field('checkbox'); ?></p>
Acest lucru va returna un array de valori pe care le poți gestiona cu o declarație foreach
. Folosind the_field('checkbox')
va returna un șir de caractere separat prin virgule cu opțiunile pe care le poți despărți ulterior.
Aș sugera de asemenea să vizitezi site-ul ACF și să parcurgi documentația. Majoritatea întrebărilor de acest tip vor fi răspunde acolo în detaliu, iar dezvoltatorul este activ și pe forumurile de suport.
EDIT: Dacă dorești să afișezi lista de opțiuni disponibile într-o pagină pentru a genera o interogare dinamică, am exact ce ai nevoie. Acesta este un fragment pe care l-am construit ieri pentru a extrage o listă de valori meta dintr-o cheie de câmp personalizat (folosind ACF). L-am făcut destul de generic pentru tine. Există un alt fragment de JS pentru gestionarea cererii AJAX și o bucată mai complexă de PHP care afișează postările rezultate. Nu le pot rescrie - JS este un apel/răspuns standard AJAX în WordPress, iar PHP este o încurcătură de verificări condiționale pentru cele 12 câmpuri ACF pe care le afișăm (dintre care 2 sunt repetoare). Bazele sunt acest cod de aici, butonul onClick
apelează funcția AJAX dintr-un fișier JS separat, iar PHP pentru funcția AJAX însăși configurează un array de argumente pentru interogare, unul dintre ele fiind $selectedOption
sau $_POST['option']
ca meta_value. Acesta este trimis către un new WP_Query( $args );
, care este apoi folosit într-o buclă, iar rezultatul este trimis înapoi la JS prin add_action('wp_ajax_the_ajax_hook', 'fetch_option_list');
și add_action( 'wp_ajax_nopriv_the_ajax_hook', 'fetch_option_list' ); //pentru utilizatorii nelogati
.
// Obține lista de meta_valori pentru o cheie meta și un tip de postare dat (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;
}
// ADAUGĂ EX. UN FORMULAR ÎN PAGINĂ
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 = "Caută" type="button" onClick="fetch_meta();" />
</form>
<div id="meta_list">
Te rugăm să selectezi o opțiune din listă
</div>';
}

Mm, dacă fac asta, voi afișa opțiunile atribuite "postării", ceea ce am nevoie este să afișez toate opțiunile într-o "pagină" ca o listă completă de opțiuni.

Sunt curios de ce ai nevoie să afișezi lista de opțiuni din backend pe frontend. Vrei doar să afișezi lista de opțiuni cu elementele selectate în admin? Dacă încerci să folosești asta ca parte a unui formular (permițând utilizatorului să modifice datele bifate), acesta nu este pluginul sau metoda potrivită pentru a face asta. Totuși, dacă vrei lista de opțiuni ca pre-filtru pentru a rescrie interogarea, s-ar putea să am exact ce îți trebuie. Voi edita postul meu de mai sus cu acel cod în curând.

Salut, sunt Bob cu un alt cont, am nevoie de opțiunile din backend pentru a crea un fel de "meniu" cu ele. Cred că codul tău preia postările și opțiunile atribuite lor. Eu am nevoie doar de lista de opțiuni ca cea care apare în backend când creezi o postare. Voi continua să lucrez cu codul tău să văd dacă pot să-mi dau seama de ceva. Mulțumesc @SickHippie

Nu, extrage lista de opțiuni care au fost selectate din acea casetă de bifare - adică spune "iată caseta de bifare, există postări cărora li s-au atribuit valorile 'opțiunea 1', 'opțiunea 2', 'opțiunea 4' și așa mai departe. Pur și simplu extrage lista meta_value pe baza acelui meta_key. Aveam nevoie de ea pentru o listă dinamică, dar dacă creezi o postare draft cu toate casetele de bifare selectate, va extrage toate opțiunile într-un array pentru tine. Acel array este cel prin care parcurg cu foreach
. Funcțiile ulterioare aduc lista de postări prin ajax, dar am omis acea parte.
