2

Wordpress 内にカスタム フィールドを持つカスタム投稿タイプを作成しました。ループを実行し、うまく機能する新しいページ テンプレートを作成しました。ホームページのサイドバーに同様のループを追加しようとしていますが、正しく機能しません。

まず、自分のページ テンプレートの作業コードです。

<h2>Upcoming Events</h2>
<?php $todaysDate = date('Y/m/d');
$event_query = new WP_query('post_type=events&posts_per_page=-1&post_status=publish&meta_key=event_date&meta_compare=>=&meta_value=' . $todaysDate . '&orderby=meta_value&order=ASC');
?> 

<ul id="featured_event_list">
<?php if ($event_query->have_posts()): ?>
<?php while ($event_query->have_posts()) : $event_query->the_post(); ?>
<li>
    <h3><?php the_title(); ?></h3>
    <p>
    <?php if ( get_post_meta($post->ID, 'event_featuring', true) ) : ?>
        <strong>Featuring:</strong> <?php echo get_post_meta($post->ID, 'event_featuring', true) ?><br />
    <?php endif; ?>
    <?php if ( get_post_meta($post->ID, 'event_date', true) ) : ?>
        <?php $event_date = get_post_meta($post->ID, 'event_date', true);
        $new_event_date = date("F j, Y",strtotime($event_date)); ?>
        <strong>Date:</strong> <?php echo $new_event_date ?>
        <?php endif; ?>
        <?php if ( get_post_meta($post->ID, 'event_end_date', true) ) : ?>
        <?php $event_end_date = get_post_meta($post->ID, 'event_end_date', true);
        $new_event_end_date = date("F j, Y",strtotime($event_end_date)); ?>
        - <?php echo $new_event_end_date ?>
    <?php endif; ?>
        <br />
    <?php if ( get_post_meta($post->ID, 'event_time', true) ) : ?>
        <strong>Time:</strong> <?php echo get_post_meta($post->ID, 'event_time', true) ?><br />
    <?php endif; ?>
    <?php if ( get_post_meta($post->ID, 'event_location', true) ) : ?>
        <strong>Location:</strong> <?php echo get_post_meta($post->ID, 'event_location', true) ?>
    <?php endif; ?>
    </p>
    <p><?php the_excerpt(); ?></p>
</li>
<?php endwhile; ?>
<?php else: ?>
<li>Sorry, no upcoming events.</li>
<?php endif; ?>
</ul>

それは正常に動作しますが、そのコードの修正版を functions.php 内のウィジェットとして配置すると、動作しません:

<?php
function eventsWidget() { ?>
    <div class="uwf_widget">
        <h3 class="events"><span>Featured Events</span></h3>
        <ul>
<?php
        $todaysDate = date('Y/m/d');
        $event_widget_query = new WP_query('post_type=events&posts_per_page=2&post_status=publish&meta_key=event_date&meta_compare=>=&meta_value=' . $todaysDate . '&orderby=meta_value&order=ASC');
?> 
        <?php if ($event_widget_query->have_posts()) :?>
        <?php while ($event_widget_query->have_posts()) : $event_widget_query->the_post(); ?>
            <?php $event_date = get_post_meta($post->ID, 'event_date', true);
            $new_event_date = date("F j",strtotime($event_date)); ?>
            <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?> - <?php echo $new_event_date; ?> &nbsp;&raquo;</a></li>
        <?php endwhile; else: ?>
            <li>Sorry, no upcoming events.</li>
        <?php endif; ?>
        </ul>
            <p class="more"><a href="/about-us/events/">more events &raquo;</a></p>
        </div>
<?php } ?>

ここで、そのコードを (ホームページではなく) 通常のサイドバー内に配置すると、問題なく動作します。したがって、ホームページとサイドバーの複数のループには明らかに何か問題があります。ウィジェットを単純化して 2 つの「イベント」のみを取得すると、(post_type に関係なく) 2 つの投稿が取得されます。rewind_posts と wp_reset_query を試しましたが、他に何を試せばよいかわかりません。

4

4 に答える 4

1

私は同じ問題を抱えており、それは wp_hook 'pre_get_posts' が原因でした

<?php function custom_get_posts( $query ) {
if ( !is_admin() && false == $query->query_vars['suppress_filters'] )
    $query->set( 'post_type', array('post', 'events', 'pages') );

    return $query;
}
add_filter( 'pre_get_posts', 'custom_get_posts' );
?>

この問題を解決するには、WP_Query の前にこのフィルターを削除し、このクエリの後に再度追加します。

<?php

remove_filter( 'pre_get_posts', 'custom_get_posts' );

/*
 * Your new WP_Query
 */

add_filter( 'pre_get_posts', 'custom_get_posts' );

?>
于 2012-06-11T15:55:29.137 に答える
0

rewind_posts()どちらのループが最初に使用された後でも試してくださいendwhile(サイドバーの呼び出しがテンプレートの下部にある場合はページ テンプレートで実行し、サイドバーが上部で呼び出されている場合はその逆を行います)。

別のアプローチ:

<?php
function eventsWidget() { ?>
    <div class="uwf_widget">
        <h3 class="events"><span>Featured Events</span></h3>
        <ul>
        <?php $todaysDate = date('Y/m/d');
        query_posts('$post_type=event&posts_per_page=2');
        if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
        <?php while ($have_posts()) : the_post(); ?>
            <?php $event_date = get_post_meta($post->ID, 'event_date', true);
            $new_event_date = date("F j",strtotime($event_date)); ?>
            <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?> - <?php echo $new_event_date; ?> &nbsp;&raquo;</a></li>
        <?php endwhile; else: ?>
            <li>Sorry, no upcoming events.</li>
        <?php endif; ?>
        </ul>
            <p class="more"><a href="/about-us/events/">more events &raquo;</a></p>
        </div>
<?php } ?>
于 2011-01-25T18:03:55.623 に答える
0

global post;関数の先頭に宣言を追加してみてください。

<?php
function eventsWidget() { 
    global $post; ?>
    <div class="uwf_widget">
        <h3 class="events"><span>Featured Events</span></h3>
        <ul>
<?php
        $todaysDate = date('Y/m/d');
        $event_widget_query = new WP_query('post_type=events&posts_per_page=2&post_status=publish&meta_key=event_date&meta_compare=>=&meta_value=' . $todaysDate . '&orderby=meta_value&order=ASC');
?> 
        <?php if ($event_widget_query->have_posts()) :?>
        <?php while ($event_widget_query->have_posts()) : $event_widget_query->the_post(); ?>
            <?php $event_date = get_post_meta($post->ID, 'event_date', true);
            $new_event_date = date("F j",strtotime($event_date)); ?>
            <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?> - <?php echo $new_event_date; ?> &nbsp;&raquo;</a></li>
        <?php endwhile; else: ?>
            <li>Sorry, no upcoming events.</li>
        <?php endif; ?>
        </ul>
            <p class="more"><a href="/about-us/events/">more events &raquo;</a></p>
        </div>
<?php } ?>
于 2011-01-25T16:38:53.167 に答える
0

私は最終的にこれを解決しました。get_posts を使用して配列を作成したところ、何らかの理由でホームページで機能するようになりました。

<?php
function eventsWidget() {?>
    <div class="uwf_widget">
        <h3 class="events"><span>Featured Events</span></h3>
        <ul>
<?php
        global $post;
        $todaysDate = date('Y/m/d');
        $event_args = array('post_type' => 'events', 
                            'numberposts' => 2,
                            'meta_key' => 'event_date',
                            'post_status' => 'publish',
                            'meta_compare' => '>=',
                            'meta_value' => $todaysDate,
                            'orderby' => 'meta_value',
                            'order'=> 'ASC');
        $event_widget_query = get_posts( $event_args );
        foreach ($event_widget_query as $post) : setup_postdata($event_widget_query); ?>
            <?php $event_date = get_post_meta($post->ID, 'event_date', true);
            $new_event_date = date("F j",strtotime($event_date)); ?>
            <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?> - <?php echo $new_event_date; ?> &nbsp;&raquo;</a></li>
        <?php endforeach; ?>
        </ul>
            <p class="more"><a href="/about-us/events/">more events &raquo;</a></p>
        </div>
        <?php wp_reset_query(); ?>
<?php } ?>
于 2011-01-27T22:30:42.537 に答える