web-dev-qa-db-fra.com

Deuxième archive de type de message personnalisé

J'ai un type de message personnalisé event et, à l'aide de filtres, j'ai configuré la page d'archivage pour afficher uniquement les événements à venir, et dans un ordre chronologique basé sur une méta-valeur (date de début).

Je souhaite créer une deuxième page d'archive pour afficher les événements passés, avec la pagination, l'ordre inverse inverse chronologique sur la même méta valeur.

Ma première pensée a été d’utiliser un shortcode dans une page normale, mais je ne sais pas comment faire fonctionner la pagination.

Sinon, existe-t-il un moyen de créer une page d'archive "générique"? Dois-je entrer dans les règles de réécriture?

1
Matt

C'est ce que je suis allé avec. Il crée une seconde archive pour des événements passés . Il affiche les événements à venir dans l'archive principale et les anciens événements dans la page des événements passés . Le tri s'effectue par ordre croissant pour l'archive principale (pour que vous voyiez d'abord le prochain événement à venir) et par ordre décroissant pour la page des événements passés , de sorte que vous voyez le plus récent. événement en premier. Il permet la pagination sur la page des événements passés . Notez que cela ne modifie pas la requête dans le système d'administration.

new My_Events_Are_Special;
class My_Events_Are_Special {

    function __construct() {
        add_filter('rewrite_rules_array', array($this, 'insert_rewrite_rules'));
        add_filter('query_vars', array($this, 'insert_query_vars'));
        add_action('wp_loaded', array($this, 'flush_rules'));
        add_filter('posts_join', array($this, 'posts_join'));
        add_filter('posts_where', array($this, 'posts_where'));
        add_filter('posts_orderby', array($this, 'posts_orderby'));
    }

    function can_modify_query() {
        return !is_admin() && is_post_type_archive('event');
    }

    // create rules for the archived events page
    var $rewrite_rules = array(
        'events/archive$' => 'index.php?post_type=event&archive_type=archive',
        'events/archive/page/([0-9]+)$' => 'index.php?post_type=event&archive_type=archive&paged=$matches[1]',
    );

    // insert rules into rewrite system
    function insert_rewrite_rules($rules) {
        return $this->rewrite_rules + $rules;
    }

    // add special query var to system
    function insert_query_vars($vars) {
        array_Push($vars, 'archive_type');
        return $vars;
    }

    // flush rules if any are new
    function flush_rules() {
        $rules = get_option('rewrite_rules');
        $flush = false;

        foreach ($this->rewrite_rules as $rule => $rewrite) {
            if (!isset($rules[$rule])) {
                global $wp_rewrite;
                $wp_rewrite->flush_rules();
                break;
            }
        }
    }

    // add start and end type to query for events (not in admin)
    function posts_join($join) {
        global $wpdb;
        if ($this->can_modify_query()) {
            $join .= " JOIN $wpdb->postmeta starts on ($wpdb->posts.ID = starts.post_id AND starts.meta_key = '_starts') ";
            $join .= " JOIN $wpdb->postmeta ends on ($wpdb->posts.ID = ends.post_id AND ends.meta_key = '_ends') ";
        }
        return $join;
    }

    // only show future events for the main archive, only past events for the "archive archive"
    function posts_where($where) {
        global $wpdb;
        if ($this->can_modify_query()) {
            $compare = get_query_var('archive_type') == 'archive' ? '<' : '>';
            $where .= " AND ends.meta_value $compare ".time();
        }
        return $where;
    }

    // main archive is ordered ascending on event start date, "archive archive" is ordered descending
    function posts_orderby($orderby) {
        global $wpdb;
        if ($this->can_modify_query()) {
            $order = get_query_var('archive_type') == 'archive' ? 'DESC' : 'ASC';
            $orderby = "starts.meta_value $order, $wpdb->posts.post_date $order";
        }
        return $orderby;
    }
}
1
Matt

J'utiliserais un paramètre de requête, quelque chose comme ?time=future peut-être, pour décaler votre requête. La différence entre la requête sur les publications futures et la requête sur les publications antérieures doit être simplement orderby et meta_query. Il devrait donc être relativement facile de la modifier en fonction du paramètre URL. Vous avez également l’avantage supplémentaire de réduire les frais généraux en le limitant à une page. Mon seul souci avec ceci serait de créer un lien dans le menu, car vous devrez utiliser des liens personnalisés, qui sont moins flexibles.

1
mor7ifer