web-dev-qa-db-fra.com

get_template_part () - post-meta ne fonctionne pas?

Peut-être que je ne comprends tout simplement pas ce que get_template_part() fait…

J'ai un fichier appelé event-list.php qui devrait servir de modèle pour d'autres pages et fichiers afin que tous mes événements (un type de publication personnalisé) soient répertoriés!

Dans ce event-list.php j'ai ce…

<?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; ?>

Ce que je veux faire, c'est donc inclure un autre modèle à l'intérieur de event-list.php nommé event-item.php qui ne contient que la présentation d'un événement. Je veux utiliser ce event-item.php peut-être plus tard aussi dans différentes boucles. Il devrait s'agir uniquement du balisage de chaque élément d'événement sur mon site Web. Si je modifie ce modèle even-item.php, tous les "événements" de l'une de mes boucles sur l'ensemble de mon site Web doivent changer.

Le problème que j'ai avec ceci est celui de l'exemple de code ci-dessus. J'utilise get_template_part( 'event-item' ); pour inclure la structure de structure event-item.php dans ma boucle. Et je reçois sa post-méta personnalisée en dehors de ce modèle. Cependant cela ne fonctionne pas!

Comme vous pouvez le voir dans mon exemple ci-dessus, je dois copier toute la structure de mise en page de mon event-item.php à l'intérieur de mon event-list.php pour que les éléments post-méta soient complétés.

Des idées sur ce que je ne comprends pas ou ce que je fais mal ici?

Merci d'avance.

Mat

1
mathiregister

Essayez de globaliser $post à l'intérieur de event-item.php.

Aussi: assurez-vous d'appeler wp_reset_postdata() après avoir fermé votre boucle $loop while.

par exemple.:

<!-- 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 -->

et alors:

<?php 
endwhile; 

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

Modifier

En supposant que le problème soit seulement les métadonnées de publication, je suggérerais de déplacer les variables de métadonnées de publication à l'intérieur de loop-item.php. Juste une supposition, mais peut-être que vos variables locales ne sont pas transmises par la fonction include() qui fait partie de get_template_part().

Alors, comme ça:

<!-- 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 -->

Aussi , pour éviter les notifications undefined variable, vous devez définir vos variables à l'aide de isset() conditionals; par exemple. change ça:

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

...pour ça:

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

Au lieu de faire:

get_template_part( 'event-item' );

faites ceci à la place:

get_template_part( 'event','item' );

get_template_part s'attend à ce que le nom du fichier soit: parameter1-parameter2.php

Assurez-vous également que vous déclarez les variables que vous souhaitez utiliser comme globales, sinon elles seront hors de portée et ne seront pas affichées:

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