Foreach get_field_object für ACF

Lesezeit: 4 Minuten

Ich habe ein benutzerdefiniertes Feld auf WordPress, das eine Auswahloption definiert

one : First
two : Second
three : Third
four : Fourth

Ich versuche, diese Optionen im Frontend in einer ausgewählten Form aufzurufen, dh

<select id="filters">
  <option value="*">show all</option>
  <option value="one">First</option>
  <option value="two">Two</option>
  <option value="three">Third</option>
  <option value="four"Fourth</option>
</select>

Folgendes habe ich bisher und es scheint nicht zu funktionieren:

<?php 
$field_name = "team_category";
$field = get_field_object($field_name);

foreach($field){
  echo $field['label'] . ': ' . $field['value'];
}
?>

Benutzeravatar von websupporter
Websupporter

Die ACF-Dokumentation besagt, dass get_field_object() bis zu drei Parameter haben kann, während die zweite die Post-ID ist. Wenn keine Post-ID verwendet wird, wird die aktuelle verwendet, die Sie auch mit get_the_ID() abrufen.

Aber wahrscheinlich möchten Sie diese Optionen auf einer anderen Seite (z. B. einer Suchseite, die Sie entwickeln). Nehmen wir an, Sie erstellen eine Seitenvorlage. Was Sie suchen möchten, sind Beiträge mit dem Beitragstyp „Teams“. Der post_type ‘page’ hat also keine benutzerdefinierten Felder namens “team_category” und mit der aktuellen Post-ID wird kein Objekt zurückgegeben.

Was Sie brauchen, ist eine Beitrags-ID eines Beitrags, der das gesuchte Feld tatsächlich enthält. Und das soll dynamisch funktionieren.

Lass es uns versuchen

<?php
global $wpdb;
$field_name = "team_category";
$sql = $wpdb->prepare( "select post_id from " . $wpdb->prefix . "postmeta where meta_key = %s limit 0,1 ", $field_name);
$post = $wpdb->get_results( $sql );

$field = get_field_object( $field_name, $post[0]->post_id );

if( $field )
{
    echo '<select name="' . $field['key'] . '">';
        foreach( $field['choices'] as $k => $v )
        {
            echo '<option value="' . $k . '">' . $v . '</option>';
        }
    echo '</select>';
}
?>

Ich denke, das könnte etwas näher an dem sein, was Sie suchen.

    foreach($field as $field_item){
    echo '<option value="'.$field_item['value'].'">' . $field_item['label'] . ': '</option>;
    }
?>

  • Das hat nicht funktioniert, ich denke, es könnte die Abfrage selbst sein, die nicht funktioniert.

    – jagmitg

    29. Juli 2014 um 10:03 Uhr

  • Wie hat es nicht funktioniert? Vielleicht könntest du noch ein paar Infos liefern. Im Allgemeinen verwende ich bei der Arbeit mit ACFs nicht die get_field_object() Funktion. Ich benutze normalerweise nur get_field() oder bei einem Repeaterfeld get_sub_field(). Die ACF-Site hat einige großartige Ressourcen. advancedcustomfields.com/resources/getting-started/…

    – Dylan Hildenbrand

    29. Juli 2014 um 14:36 ​​Uhr


Benutzeravatar von isabisa
isabisa

Ich weiß, dass dies eine alte Frage ist, wollte aber meine Antwort für andere wegwerfen, die dies möglicherweise finden. Es gibt ein paar Probleme mit Ihrem Code:

  1. Laut dem ACF-Dokumentation für get_field_object()sagen sie: “Unter bestimmten Umständen kann es erforderlich sein, ein Feld anhand seines Schlüssels zu laden, z. B. wenn ein Wert noch nicht gespeichert wurde.” Ich habe festgestellt, dass der Feldname nicht funktioniert, wenn versucht wird, ein Feldobjekt außerhalb einer Schleife abzurufen (was Sie hier tun, indem Sie versuchen, alle Optionen innerhalb eines Felds anzuzeigen, nicht nur die, die sich auf einen bestimmten Beitrag beziehen).

    Eine weitere Herausforderung besteht darin, dass der Feldschlüssel je nach Umgebung (lokal, Staging, Produktion usw.) unterschiedlich sein kann, es sei denn, Sie synchronisieren Ihre Datenbanken. Hier ist also eine Funktion, die Ihnen helfen kann, den Feldschlüssel anhand des Feldnamens zu finden, wann immer Sie ihn in einer Funktion wie get_field_object() verwenden müssen:

if (! function_exists('acf_field_from_name')) {

   function acf_field_from_name($field, $group)
   {
       global $wpdb;

       return $wpdb->get_var($wpdb->prepare("
           SELECT post.post_name as field_name
           FROM $wpdb->posts AS post
           LEFT JOIN $wpdb->posts AS parent
               ON post.post_parent = parent.id
           WHERE post.post_excerpt = %s
               AND post.post_type="acf-field"
               AND parent.post_excerpt = %s
               AND parent.post_type="acf-field-group"
       ", $field, $group));
   }
}

Gibt den Feldschlüssel aus Name und Gruppe zurück oder null, wenn keiner vorhanden ist.

Verwendungszweck:

acf_field_from_name('title', 'movie-fields'); // returns field_3333333333333

acf_field_from_name('title', 'book-fields'); // returns field_4444444444444

acf_field_from_name('plumbus', 'movie'); // returns null

Siehe die vollständige Antwort von @Chris darüber, warum der Gruppenname wichtig ist in How to get Advanced Custom Fields field key from WordPress database?

Dann wäre dein Code:

$field_name = "team_category";
$group_name = "team_fields";
$field_key = acf_field_from_name($field_name, $group_name);
$team_category_field = get_field_object($field_key);
  1. Das zweite Problem besteht darin, dass die Optionen für Auswahl-, Kontrollkästchen- und Optionsfelder als Array innerhalb eines Elements innerhalb des Feldobjekt-Arrays unter dem Schlüssel gespeichert werden choices. Um diese zu erhalten, müssen Sie Folgendes verwenden:
  $team_category_choices = $team_category_field['choices'];
  1. Das dritte Problem ist Ihr für jeden() Funktion ist falsch. Sie müssen das Array übergeben und definieren, wie jeder der Array-Elementschlüssel (in der DB gespeicherter Auswahlwert) und Werte (in der Benutzeroberfläche angezeigte Auswahlbezeichnung) innerhalb der inneren Funktion referenziert wird, wie folgt:
foreach($team_category_choices as $choice_value => $choice_label) {
  echo '<option value="' . $choice_value . '">' . $choice_label . '</option>';
}

1435470cookie-checkForeach get_field_object für ACF

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy