it-swarm.com.de

get_template_part () - Post-Meta funktioniert nicht?

Vielleicht verstehe ich einfach nicht, was get_template_part() tut ...

Ich habe eine Datei namens event-list.php, die als Vorlage für andere Seiten und Dateien dienen soll, damit alle meine Ereignisse (ein benutzerdefinierter Beitragstyp) aufgelistet werden!

In diesem event-list.php habe ich das…

<?php
$loop = new WP_Query( $args );
while ( $loop->have_posts() ) : $loop->the_post();
    $wr_event_fields = get_post_custom();
    $event_date_timestamp = $wr_event_fields['_wr_event_date'][0];
    $event_date = strftime('%d.%m.%Y', $event_date_timestamp);
    $event_time = $wr_event_fields['_wr_event_time'][0];
    $event_speaker = $wr_event_fields['_wr_event_speaker'][0];  
    //get_template_part( 'event-item' );
?>
    <!-- event-item.php -->
    <div id="event-<?php the_ID(); ?>" <?php post_class(); ?>>

        <div class="event-date"><?php echo $event_date; ?></div>
        <div class="event_time"><?php echo $event_time; ?></div>
        <div class="event-speaker"><?php echo $event_speaker; ?></div>
        <div class="event-title"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></div>
        <div class="event-description-excerpt"><?php the_excerpt(); ?></div>

    </div>
    <!-- event-item.php -->

<?php endwhile; ?>

Ich möchte also eine weitere Vorlage in event-list.php mit dem Namen event-item.php einfügen, die nur das Layout eines Ereignisses enthält. Ich möchte diesen event-item.php vielleicht später auch in verschiedenen Loops verwenden. Es sollte nur das Markup für jedes einzelne Ereigniselement auf meiner Website sein. Wenn ich eine Änderung in dieser even-item.php-Vorlage vornehme, sollten sich alle "Ereignisse" in einer meiner Schleifen auf meiner gesamten Website ändern.

Das Problem, das ich damit habe, ist das im obigen Beispielcode. Ich benutze get_template_part( 'event-item' );, um die event-item.php-Layoutstruktur in meine Schleife aufzunehmen. Und ich bekomme seine benutzerdefinierten Post-Meta außerhalb dieser Vorlage. Das geht aber nicht!

Wie Sie in meinem obigen Beispiel sehen können, muss ich die gesamte Layoutstruktur von meinem event-item.php in meinen event-list.php kopieren, damit das Post-Meta-Material ausgefüllt wird.

Irgendwelche Ideen, was ich hier nicht verstehe oder was ich hier falsch mache?

Danke im Voraus.

Matt

1
mathiregister

Versuchen Sie, $post innerhalb von event-item.php zu globalisieren.

Außerdem: Stellen Sie sicher, dass Sie wp_reset_postdata() aufrufen, nachdem Sie Ihre $loop while-Schleife geschlossen haben.

z.B.:

<!-- event-item.php -->
<?php 
// globalize $post
global $post; 
?>
<div id="event-<?php the_ID(); ?>" <?php post_class(); ?>>

    <div class="event-date"><?php echo $event_date; ?></div>
    <div class="event_time"><?php echo $event_time; ?></div>
    <div class="event-speaker"><?php echo $event_speaker; ?></div>
    <div class="event-title"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></div>
    <div class="event-description-excerpt"><?php the_excerpt(); ?></div>

</div>
<!-- event-item.php -->

und dann:

<?php 
endwhile; 

// Restore $post global to the primary query
wp_reset_postdata();
?>

Bearbeiten

Angenommen, das Problem sind nur die Post-Metadaten, würde ich vorschlagen, die Post-Metadaten-Variablen in loop-item.php zu verschieben. Nur eine Vermutung, aber vielleicht werden Ihre lokalen Variablen nicht durch die Funktion include() geleitet, die Teil von get_template_part() ist.

Also so:

<!-- event-item.php -->
<?php
// Define these here, inside loop-item.php
$wr_event_fields = get_post_custom();
$event_date_timestamp = $wr_event_fields['_wr_event_date'][0];
$event_date = strftime('%d.%m.%Y', $event_date_timestamp);
$event_time = $wr_event_fields['_wr_event_time'][0];
$event_speaker = $wr_event_fields['_wr_event_speaker'][0]; 
?> 
<div id="event-<?php the_ID(); ?>" <?php post_class(); ?>>

    <div class="event-date"><?php echo $event_date; ?></div>
    <div class="event_time"><?php echo $event_time; ?></div>
    <div class="event-speaker"><?php echo $event_speaker; ?></div>
    <div class="event-title"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></div>
    <div class="event-description-excerpt"><?php the_excerpt(); ?></div>

</div>
<!-- event-item.php -->

Auch , um undefined variable Hinweise zu vermeiden, sollten Sie Ihre Variablen mit isset() conditionals definieren; z.B. ändere das:

$event_date_timestamp = $wr_event_fields['_wr_event_date'][0];

... dazu:

$event_date_timestamp = ( isset( $wr_event_fields['_wr_event_date'][0] ) ? $wr_event_fields['_wr_event_date'][0] : false );
2
Chip Bennett

Anstatt zu tun:

get_template_part( 'event-item' );

mach das stattdessen:

get_template_part( 'event','item' );

get_template_part erwartet folgenden Dateinamen: parameter1-parameter2.php

Stellen Sie außerdem sicher, dass Sie die Variablen deklarieren, die Sie als globale Variablen verwenden möchten. Andernfalls liegen sie außerhalb des Gültigkeitsbereichs und werden nicht angezeigt:

global $event_date, $event_time, $event_speaker;
2
Tom J Nowell