web-dev-qa-db-ja.com

投稿タイプアーカイブのカスタムクエリの並べ替え順序が機能しない

私はイベント用のカスタム投稿タイプを設定し、カスタム投稿タイプアーカイブ "archive-events.php"に投稿を表示しています。

ユーザーが選択した各投稿にイベントの日付 "event_date"を設定するために、高度なカスタムフィールドを使用しています。日付は "yyyymmdd"の形式で出力されています。例: "20141129"。

イベントの開催日が2日を超えても表示されないように設定します。通過したイベントを非表示にします。この機能は正しく機能しています。

問題は、何らかの理由で投稿のソート順を変更できないということです。最も近い日付が最初に表示されるようにイベントを注文して、どのイベントが開催されるのかをユーザーに知らせます。だから私は"event_date"で投稿を並べるになります。

私は3時間かけて同様の問題を経験し、無駄にそれらのコードを実装しようとしました。私は他のさまざまなページのコードを試してみて、単純な形式でアーカイブしていますが、そこでも機能しません。 カスタム投稿タイプはクエリではなく問題であるようですになるところまできました。

私は自分の質問の一部を見逃しているように感じますが、それは他の誰もが正しい答えを得ていますが、どれも私の問題を解決していないためです。

クエリを構築するためのコードに参照の一部を含めました。

UPDATE:私は、まったく同じ投稿タイプを作成しても「イベント」ではなく「イベント」と呼ぶと、コードが実際に機能することを発見しました。これが事実であるかもしれない理由がありますか?私はデータベースを調べて、問題を見つけることができ、疑わしいものが見つからないかどうかを確認してきました。

Wp_postmeta - meta_keyルールにentryがあり、meta_valueは以下のとおりです。a:5{s:5:"param";s:9:"post_type";s:8:"operator";s:2:"==";s:5:"value";s:6:"events";s:8:"order_no";i:0;s:8:"group_no";i:0;}

それは問題になるかもしれませんが、私はその行を削除しようとしました、そして、何も変わらないようでした。

Archive-events.phpの中

<?php

        // http://www.advancedcustomfields.com/resources/filter-posts-by-custom-fields/
        // See also: http://www.smashingmagazine.com/2009/06/10/10-useful-wordpress-loop-hacks/
        // See also: http://wordpress.org/support/topic/query_posts-less-than-6-months-old

        // Show posts between now and X months ago.
        // http://thewichitacomputerguy.com/blog/php-date-datecreate-strtotime-options
        // http://codex.wordpress.org/Class_Reference/WP_Meta_Query

        // Clue: We are trying to order posts on a an archive page here.
        // https://wordpress.stackexchange.com/questions/167441/ascending-order-custom-post-type

        /*
            These queries check to see if the event date has come. If the date more than two days ago it moves it into the past events section. This may need to change depening on how long some events go for. This algorithm assumes events only go for a day but it's possible an event could go for a month.
        */

        // Get the date from two days ago.
        $date_1 = date('Ymd', strtotime("2 days ago"));

        $args = array(
            'post_type'         => 'events',
            'posts_per_page'    => -1,
            'meta_key'          => 'event_date',
            'orderby'           => 'meta_value_num',
            'order'             => 'ASC',
            // This line ignores plugin ordering.
            'suppress_filters'  => true,
            'meta_query'        => array(
                array(
                    // Is the event less then two days past?
                    'key'       => 'event_date',
                    'value'     => $date_1,
                    'type'      => 'numeric',
                    'compare'   => '>'
                )
            )
        );

        // query
        $wp_query = new WP_Query( $args );

        if ( $wp_query->have_posts() ) {

            // loop
            while( $wp_query->have_posts() )
            {
              $wp_query->the_post();

              get_template_part( 'content', 'events');

            }
        } else {
            // no posts found
        }

        // Reset query
        wp_reset_postdata();

        ?>

Inside functions.php

/**
 * Create Custom Post Type "Events".
 */

function lc_events_post_type() {

$labels = array(
    'name'                => _x( 'Events', 'Post Type General Name', 'leederville-connect' ),
    'singular_name'       => _x( 'Event', 'Post Type Singular Name', 'leederville-connect' ),
    'menu_name'           => __( 'Events', 'leederville-connect' ),
    'parent_item_colon'   => __( 'Event:', 'leederville-connect' ),
    'all_items'           => __( 'All Events', 'leederville-connect' ),
    'view_item'           => __( 'View Event', 'leederville-connect' ),
    'add_new_item'        => __( 'Add New Event', 'leederville-connect' ),
    'add_new'             => __( 'Add New Event', 'leederville-connect' ),
    'edit_item'           => __( 'Edit Event', 'leederville-connect' ),
    'update_item'         => __( 'Update Event', 'leederville-connect' ),
    'search_items'        => __( 'Search Events', 'leederville-connect' ),
    'not_found'           => __( 'Event Not found', 'leederville-connect' ),
    'not_found_in_trash'  => __( 'Event Not Found in Trash', 'leederville-connect' ),
);
$args = array(
    'label'               => __( 'events', 'leederville-connect' ),
    'description'         => __( 'The latest events in Leederville.', 'leederville-connect' ),
    'labels'              => $labels,
    'supports'            => array( 'title' ),
    'taxonomies'          => array( 'event_category' ),
    'hierarchical'        => false,
    'public'              => true,
    'show_ui'             => true,
    'show_in_menu'        => true,
    'show_in_nav_menus'   => true,
    'show_in_admin_bar'   => true,
    'menu_position'       => 5,
    'menu_icon'           => 'dashicons-calendar',
    'can_export'          => true,
    'has_archive'         => true,
    'exclude_from_search' => false,
    'publicly_queryable'  => true,
    'capability_type'     => 'post',
);
register_post_type( 'events', $args );

}

// Hook into the 'init' action
add_action( 'init', 'lc_events_post_type', 0 );

いくつかの関連質問

5
Jake

問題は解決しましたが、クエリ、データベース、投稿の種類とは関係ありません。

問題は、最初にクエリを構築しようとしたときに、自分のfunctions.phpにpre_get_posts関数が残っていて、それが私のクエリと衝突していたことです。ここでのレッスンは、すべてのファイルを徹底的にチェックしたことを確認することです。

問題のあるカウンタコード

// Events Pre Get Posts

function my_pre_get_posts( $query )
{
    // validate
    if( is_admin() )
    {
        return $query;
    }


    if( isset($query->query_vars['post_type']) && $query->query_vars['post_type'] == 'events' )
    {
        $query->set('orderby', 'meta_value_num');
        $query->set('meta_key', 'event_date');
        $query->set('order', 'DESC');
    }

    // always return
    return $query;

}

add_action('pre_get_posts', 'my_pre_get_posts');
5
Jake