web-dev-qa-db-ja.com

get_template_part() - ポストメタが動かない?

たぶん私は単にget_template_part()が何をしているのか理解していません…

他のページやファイルのテンプレートとして機能するevent-list.phpという名前のファイルがあるので、すべてのイベント(カスタム投稿タイプ)が一覧表示されます。

このevent-list.phpの中にこれがあります…

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

だから私がやりたいことはevent-list.phpの中にイベントのレイアウトだけを保持するevent-item.phpという名前の別のテンプレートを含めることです。このevent-item.phpを後で別のループでも使用したいのですが。それは私のウェブサイト上のそれぞれの単一のイベントアイテムのためのマークアップであるべきです。このeven-item.phpテンプレート内で変更を加えると、私のウェブサイト全体のいずれかのループ内のすべての「イベント」が変わるはずです。

私がこれで抱えている問題は、上記のサンプルコードにあるものです。私はループ内にevent-item.phpレイアウト構造を含めるためにget_template_part( 'event-item' );を使用します。そして私はこのテンプレートの外でカスタムのポストメタを取得します。しかしそれはうまくいきません!

上記の私のサンプルで見られるように、私は私のevent-item.phpの中の私のevent-list.phpから全体のレイアウト構造をコピーしなければならないので、ポストメタのものは記入されます。

私がここに来なかったこと、または私がここで間違っていることについての考えは何ですか?

前もって感謝します。

マット

1
mathiregister

$post内でevent-item.phpをグローバル化してみてください。

また、$loop whileループを閉じた後は、必ずwp_reset_postdata()を呼び出してください。

例えば。:

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

その後:

<?php 
endwhile; 

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

編集する

問題が投稿メタデータのみであると仮定すると、投稿メタデータ変数loop-item.php内に移動することをお勧めします。推測だけですが、おそらくあなたのローカル変数はinclude()の一部であるget_template_part()関数を通過していません。

だから、このように:

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

また、undefined variableの通知を避けるために、isset()条件を使って変数を定義する必要があります。例えばこれを変える:

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

...これに:

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

する代わりに:

get_template_part( 'event-item' );

代わりにこれを行ってください。

get_template_part( 'event','item' );

get_template_partは、ファイル名が次のようになることを想定しています。parameter1-parameter2.php

また、グローバルとして使用したい変数を宣言していることを確認してください。そうしないと、それらは範囲外になり、表示されません。

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