web-dev-qa-db-fra.com

Filtrage personnalisé de post admin par meta post (la date)

J'ai créé un type de publication personnalisé pour les événements qui utilise un champ personnalisé pour extraire la date de l'événement. Cela fonctionne bien et je peux filtrer les résultats affichés en utilisant meta_compare pour comparer la valeur de la date à la date actuelle.

Jusqu'ici tout va bien. Je peux également filtrer l'administrateur pour afficher des événements futurs ou passés (ou les deux en supprimant le meta compare) via un filtre pre get posts.

Ce que je veux faire, c'est créer une page d'administration qui affichera les événements passés. J'ai créé la page (et l'élément de menu) avec le code suivant:

add_action('admin_menu', 'add_concerts_page');
function add_concerts_page() {
    add_submenu_page('edit.php?post_type=concerts', 'Concerts Archive', 'Concerts Archive', 'manage_options', 'concerts-archive', 'my_archive_function' );
}

function my_archive_function() {}

Mais je ne sais pas comment écrire la fonction !! Je peux écrire une boucle régulière et filtrer les résultats, comme je le ferais au début, mais tout ce que j'ai à faire, c'est d'afficher les mêmes informations que la page d'administration normale, mais en affichant les événements passés.

Voici comment filtrer l'écran d'édition des publications personnalisées pour n'afficher que les événements futurs:

function concerts_pre_get_posts($query) {
  if (is_admin()) {
    if (isset($query->query_vars['post_type'])) {
      if ($query->query_vars['post_type'] == 'concerts') {
          $query->set('meta_key', 'date_value');
          $query->set('orderby', 'meta_value');
          $query->set('order', 'ASC');
    $query->set('meta_compare', '>=');
          $query->set('meta_value', time());

      }
    }
  }
}
add_filter('pre_get_posts' , 'concerts_pre_get_posts');

Je n'ai pas vraiment besoin de créer une page d'archivage séparée pour les événements passés, mais un simple lien pour basculer la requête du passé vers les événements futurs sur cette page serait super, mais je ne sais pas comment faire pour le faire!

Toute aide grandement appréciée!

2
Richard Sweeney

Vous devez stocker vos dates dans un format triable tel que AAAA-MM-JJ ou un horodatage Unix, sinon vous ne pouvez pas le faire avec une simple requête. Une fois qu'il est au format AAAA-MM-JJ, cela devrait fonctionner. essaye ça:

function concerts_pre_get_posts( $query ) {
    if ( !is_admin() )
        return;

    if ( isset( $query->query_vars[ 'post_type' ] ) && $query->query_vars[ 'post_type' ] == 'concerts' ) {
        $query->set( 'orderby', 'meta_value' );
        $query->set( 'order', 'ASC' );
        $query->set( 'meta_query', array(
            array(
                'key' => 'date_value',
                'value' => date( "Y-m-d" ),
                'compare' => '<=',
                'type' => 'DATE'
            )
        ) );
    }
}
add_filter( 'pre_get_posts', 'concerts_pre_get_posts' );
2
dwenaus