web-dev-qa-db-fra.com

L'ordre de tri d'une requête personnalisée dans une archive de type d'article ne fonctionne pas

J'ai un type de publication personnalisé pour les événements configurés et je les affiche dans une archive de type de publication personnalisée "archive-events.php".

J'utilise Advanced Custom Fields pour ajouter une date d'événement "event_date" à chaque publication, choisie par l'utilisateur. La date est générée dans le format "aaaammjj", par exemple: "20141129".

Je l'ai configuré pour que, si une date d'événement a plus de deux jours, elle ne soit pas affichée. cacher les événements qui ont passé. Cette fonction fonctionne correctement.

Le problème est que pour une raison quelconque je ne peux pas modifier l’ordre de tri des publications . Je veux commander les événements de sorte que la date la plus proche apparaisse en premier afin que les gens sachent quels sont les événements à venir. Je serais donc classer les publications par "date_événement" .

J'ai passé trois heures à traverser des problèmes similaires et à essayer d'implémenter leur code en vain. J'ai essayé le code sur diverses autres pages et archives sous des formes simples et cela ne marche pas non plus. Je suis arrivé à un point où il semble que le type de message personnalisé soit le problème et non la requête .

J'ai l'impression qu'il me manque une partie de ma question car tout le monde a les bonnes réponses mais aucune ne résout mon problème.

J'ai inclus certaines de mes références dans le code permettant de générer la requête.

UPDATE: J'ai découvert que le code fonctionnait bien lorsque je fais le même type de message, mais que je l'appelais "événement" au lieu de "événements". Y a-t-il une raison pour laquelle cela pourrait être le cas? J'ai parcouru la base de données pour voir si je pouvais détecter un problème et je ne trouve rien de trop suspect.

Il existe une entrée dans wp_postmeta - règle meta_key avec la valeur_méta étant: 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;}

Cela pourrait être un problème mais j'ai essayé de supprimer cette ligne et rien ne semblait changer.

À l'intérieur 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();

        ?>

À l'intérieur de 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 );

Quelques questions connexes

5
Jake

J'ai résolu mon problème et cela n'avait rien à voir avec la requête, la base de données ou le type de publication.

Le problème était que, en essayant de construire initialement la requête, j'avais laissé une fonction pre_get_posts dans mon functions.php qui était en conflit avec ma requête. La leçon à tirer ici est de vérifier que j'ai bien vérifié TOUS les fichiers.

Le code compteur incriminé:

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