ACF-Beziehungsfelder – get_field-Werte von anderen Beitragstypen

Lesezeit: 5 Minuten

ACF Beziehungsfelder – get field Werte von anderen Beitragstypen
Wharfdale

Auf meiner POSTS-Seite (normaler Posttyp) habe ich ein ACF-Beziehungsfeld eingerichtet. Darin kann ich Firmennamen auswählen, die alle unter dem Beitragstyp directory_listings stehen.

Jetzt habe ich den folgenden Code auf der Seite mit den Verzeichnislisten, und daher funktioniert die einfache Verwendung von get_field nicht, da sich diese Werte nicht auf dieser Seite befinden, sondern an anderer Stelle im POST-Typ.

Sie sind sich also nicht sicher, wie Sie die Informationen abrufen sollen.

Code auf einer der Seiten, die sich unter dem Beitragstyp DIRECTORY_LISTINGS befindet:

$posts = get_field('related_articles');

if( $posts ): ?>
    <ul>
    <?php foreach( $posts as $post): // variable must be called $post (IMPORTANT) ?>
        <?php setup_postdata($post); ?>
        <li>
            <a href="https://stackoverflow.com/questions/27403089/<?php%20the_permalink();%20?>"><?php the_title(); ?></a>
        </li>
    <?php endforeach; ?>
    </ul>
    <?php wp_reset_postdata(); // IMPORTANT - reset the $post object so the rest of the page works correctly ?>
<?php endif; ?>

Beispieldiagramm, da ich nicht gut darin bin, per Text zu erklären.
Geben Sie hier die Bildbeschreibung ein

Derzeit habe ich stattdessen das Beziehungsfeld auf der Firmenbearbeitungsseite (directory_listing) eingerichtet. Es funktioniert, wenn Sie Folgendes tun: 1) Verwandte Beiträge zu diesem Brancheneintrag -> Wählen Sie einen Beitrag -> Veröffentlichen -> zeigt jetzt die Liste auf der Brancheneintragsseite an. Beispiel hier: http://bit.ly/1vwydDl (Seitenende)

2) Ich möchte auf der POST-Bearbeitungsseite ein Unternehmen auswählen, in dem Beiträge erscheinen sollen. Ich kann das Feld problemlos über ACF dort ablegen, aber es dazu zu bringen, die Ergebnisse tatsächlich anzuzeigen, kann ich nicht herausfinden.

  • Jeder Post hat eine ID, also beim Aufrufen get_field in deinem foreach musst du die $post->ID mit übergeben. Ich denke, das meinst du, oder?

    – SBD

    10. Dezember 2014 um 14:31 Uhr


  • Nun, das get_field erhält gerade nichts, weil das Feld „related_directories“ im Post-Typ gefunden wird, nicht im Post-Typ „directory_listings“. Also zeigt var_dump($posts) im Moment nichts/NULL an, was in Anbetracht dessen erwartet wird. Es muss in einen anderen Beitragstyp gehen, die Informationen abrufen und sie zum Beitragstyp directory_listings zurückbringen, um die Informationen auszugeben.

    – Wharfdale

    10. Dezember 2014 um 14:38 Uhr

  • Ja, also rufen Sie in der Datei, in der Sie Ihre Posts erhalten, das Beziehungsfeld auf. Dann durchlaufen Sie Ihre $posts-Variable. <?php foreach( $posts as $post): $some_field = get_field('field_name', $post->ID); ?> So etwas sollte funktionieren.

    – SBD

    10. Dezember 2014 um 14:46 Uhr

1646339349 355 ACF Beziehungsfelder – get field Werte von anderen Beitragstypen
rnevius

Hintergrundinformation:

get_field() hat drei Parameter:

  1. $field_name: der Name des abzurufenden Feldes. zB “page_content” (erforderlich)
  2. $post_id: Spezifische Beitrags-ID, wo Ihr Wert eingegeben wurde. Standardmäßig die aktuelle Beitrags-ID (nicht erforderlich). Das können auch Optionen / Taxonomien / Benutzer / etc sein
  3. $format_value

Wenn es Ihnen nur darum ginge, einen bestimmten Beitrag zu greifen (von dem Sie die ID kennen), wäre der Schlüssel der zweite Parameter ($post_id). Es gibt nichts wirklich Magisches an ACF. Ganz einfach: die meta_value (d. h. das Verzeichnis, mit dem der Beitrag verknüpft ist) wird zu jedem Beitrag gespeichert (angehängt an diesen Beitrag). $post_id).

In Ihrem Fall kennen wir jedoch die ID der Beiträge, die wir abrufen möchten, nicht.

Lösung:

Wenn wir in einem einfachen Satz erklären, was Sie tun möchten, würde dieser Satz in etwa so aussehen:

Beiträge anzeigen/erhalten auf a directory_listings (benutzerdefinierter Beitragstyp) Seite, die eine meta_value was auf diese Seite zeigt.

Offensichtlich können Sie nicht verwenden get_field(), weil Ihr Problem nichts mit “ein Feld bekommen” zu tun hat. Vielmehr müssen Sie “die Beiträge finden, die ein bestimmtes Feld haben”. ACF hat tolle Doku dazu.

Zum Glück für Sie wird WordPress mit einer großartigen Klasse namens a WP_Abfrageund eine ähnlich tolle Funktion namens get_posts(). Wenn wir also auf unseren obigen Satz zurückblicken und ihn in eine Funktion übersetzen, wollen wir: get_posts() bei dem die meta_key hat ein value des Stroms $post_id.

Oder genauer gesagt auf Ihre directory_listings Seite hätten Sie die folgende Abfrage:

$related_articles = get_posts(array(
    'post_type' => 'post',
    'meta_query' => array(
        array(
            'key' => 'related_articles', // name of custom field
            'value' => '"' . get_the_ID() . '"',
            'compare' => 'LIKE'
        )
    )
));

if( $related_articles ): 
    foreach( $related_articles as $article ): 

    // Do something to display the articles. Each article is a WP_Post object.
    // Example:

    echo $article->post_title;  // The post title
    echo $article->post_excerpt;  // The excerpt
    echo get_the_post_thumbnail( $article->ID );  // The thumbnail

    endforeach;
endif;

  • Gute Frage, tolle Antwort. Wenn nur alle SO Fragen und Antworten so wären.

    – McNab

    12. Dezember 2014 um 15:14 Uhr

  • Ich habe dies in meine Seite (single.php) eingefügt. Ein verwandtes Unternehmen auf der Seite POSTS in Admin (Design Locker) ausgewählt und veröffentlicht. Auf dieser Unternehmensseite erscheint nun der Titel Design Locker. Nicht der Titel des Beitrags. Ich habe the_title gesetzt; Ich denke vielleicht, weil diese Seite bereits in einer Schleife ist. Ich habe versucht, die Dinge auf das neue WP_Query umzustellen, aber dann kam es einfach mit den 10 neuesten Beiträgen zurück und ignorierte die Argumente.

    – Wharfdale

    12. Dezember 2014 um 15:42 Uhr


  • Sie können nicht verwenden the_title() um auf den Titel zuzugreifen $related_articlesAußer du setup_postdata() (Schauen Sie sich den Codex-Link an, für den ich gepostet habe get_posts()). Da Sie bereits auf dem Laufenden sind, ist die Verwendung möglicherweise besser echo $article->post_title.

    – rnevius

    12. Dezember 2014 um 15:53 ​​Uhr

  • Das ist es! Funktioniert damit perfekt, danke! Jetzt, wo ich zuerst $article-> machen muss, ändern sich die Tags? Ich habe versucht $article->the_excerpt; aber ohne Ergebnis. Gleiches gilt für den Versuch, das Miniaturbild zu erhalten.

    – Wharfdale

    12. Dezember 2014 um 16:15 Uhr

  • Schaut man sich die an Rückgabewert von get_posts()Sie werden sehen, dass a zurückgegeben wird WP_Post-Objekt <-- klicken Sie darauf. Auf den Auszug würde über zugegriffen werden $article->post_excerpt. Das Miniaturbild wäre echo get_the_post_thumbnail( $article->ID ). Bitte schließen Sie diese Frage, wenn meine Antwort das Problem löst.

    – rnevius

    12. Dezember 2014 um 16:25 Uhr


Wenn Sie in dieser Abfrage nach einem benutzerdefinierten Feld suchen, können Sie dies folgendermaßen tun:

<?php
$posts = get_field('related_articles');

if( $posts ): ?>
    <ul>
    <?php foreach( $posts as $post): // variable must be called $post (IMPORTANT) ?>
        <?php setup_postdata($post); ?>
        <li>
            <a href="https://stackoverflow.com/questions/27403089/<?php%20the_permalink();%20?>"><?php the_title(); ?></a>
            <?php the_field('your_custom_field',$post); ?>
        </li>
    <?php endforeach; ?>
    </ul>
    <?php wp_reset_postdata(); // IMPORTANT - reset the $post object so the rest of the page works correctly ?>
<?php endif; ?>

Wenn ich das richtig verstanden habe, ist das das gleiche Problem wie bei mir. In meinem Fall habe ich es vorgezogen, mit Shortcodes zu arbeiten. Verwenden [acf field="person"] Da das Feld eine Beziehung ist, gab mir nur die ID der Person, aber ich konnte nicht auf ihre Felder zugreifen. Auf der anderen Seite verwenden [acf field="last_name", post_id=[acf field="person"]was eine ideale Lösung wäre, funktioniert nicht, da der WordPress-Parser keine verschachtelten Shortcodes zulässt.

Deshalb habe ich mir diese sehr kleine PHP-Lösung ausgedacht:

function import_cf_from_cpt( $atts ) {
    // import custom fields from other custom post types that are connected via a relationship to the calling custom post type
    // shortcode: [import <field from calling CPT of type relationship> <field name from field from other CPT>]
    // ex [import person last_name] --> Doe

    $postID = do_shortcode("[acf field={$atts[0]}]");
    // we use the first attribute to get the ID of the object
    $postField = get_field($atts[1], $postID);
    // next, using the ID we look for the field of the second attribute.
return $postField;
}
add_shortcode( 'import', 'import_cf_from_cpt' );

Wenn Sie dies in der Datei functions.php platzieren, können Sie den Shortcode verwenden

[import person last_name] zum Beispiel oder jede andere Kombination, um Feldwerte aus anderen Beiträgen zu importieren.

927150cookie-checkACF-Beziehungsfelder – get_field-Werte von anderen Beitragstypen

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

Privacy policy