it-swarm.com.de

Benutzerdefinierte Post-Admin-Filterung nach Post-Meta (Datum)

Ich habe einen benutzerdefinierten Beitragstyp für Ereignisse erstellt, der ein benutzerdefiniertes Feld verwendet, um das Datum für das Ereignis abzurufen. Es funktioniert einwandfrei und ich kann die angezeigten Ergebnisse mit meta_compare filtern, um den Datumswert mit dem aktuellen Datum zu vergleichen.

So weit, ist es gut. Ich kann auch das Admin-Ende filtern, um zukünftige oder vergangene Ereignisse (oder beides, indem der meta compare entfernt wird) über einen pre get posts-Filter anzuzeigen.

Ich möchte eine Admin-Seite erstellen, auf der die vergangenen Ereignisse angezeigt werden. Ich habe die Seite (und den Menüpunkt) mit folgendem Code erstellt:

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() {}

Aber ich weiß nicht, wie ich die Funktion schreiben soll !! Ich kann eine reguläre Schleife schreiben und die Ergebnisse filtern, wie ich es im Front-End tun würde, aber alles, was ich tun muss, ist, die gleichen Informationen wie auf der normalen Administrationsseite anzuzeigen, aber Ereignisse anzuzeigen, die seitdem vergangen sind.

So filtere ich den Bearbeitungsbildschirm für benutzerdefinierte Beiträge, um nur zukünftige Ereignisse anzuzeigen:

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');

Ich muss nicht unbedingt eine separate Archivseite für vergangene Ereignisse erstellen. Nur ein Link zum Umschalten der Abfrage von früheren auf zukünftige Ereignisse auf dieser Seite wäre großartig, aber ich habe keine Ahnung, wie Sie dies tun sollen!

Alle helfen sehr dankbar!

2
Richard Sweeney

Sie müssen Ihre Daten in einem sortierbaren Format wie JJJJ-MM-TT oder als Unix-Zeitstempel speichern, sonst können Sie dies nicht nur mit einer Abfrage tun. Sobald es das Format JJJJ-MM-TT hat, sollte dies funktionieren. Versuche dies:

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