たぶん私は単に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
から全体のレイアウト構造をコピーしなければならないので、ポストメタのものは記入されます。
私がここに来なかったこと、または私がここで間違っていることについての考えは何ですか?
前もって感謝します。
マット
$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 );
する代わりに:
get_template_part( 'event-item' );
代わりにこれを行ってください。
get_template_part( 'event','item' );
get_template_part
は、ファイル名が次のようになることを想定しています。parameter1-parameter2.php
また、グローバルとして使用したい変数を宣言していることを確認してください。そうしないと、それらは範囲外になり、表示されません。
global $event_date, $event_time, $event_speaker;