it-swarm.com.de

Verwendung des als benutzerdefiniertes Feld gespeicherten Datums zum Filtern der in admin angezeigten Beiträge

Dies scheint ein recht häufiges Problem zu sein, aber ich poste dies, da ich hier auf WP noch keine Lösung für mein Problem gefunden habe.

Ok - also habe ich einen benutzerdefinierten Beitragstyp von 'Ereignissen', bei dem ich das Datum des Ereignisses in einem benutzerdefinierten Feld aufzeichne und es als Unix-Zeitstempel speichere. Das Filtern von Beiträgen im Front-End ist kein Problem, wenn Sie den folgenden Code verwenden, um nur zukünftige Ereignisse anzuzeigen:

$events = new WP_Query( 'post_type=events&posts_per_page=-1&meta_key=date_value&orderby=meta_value&meta_compare=>=&meta_value='.time().'&order=ASC' );

Ich habe versucht, die Ergebnisse im Admin auf die gleiche Weise mit einem pre_get_posts-Filter zu filtern:

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

Aber im Admin lässt dieser Code einfach alle meine Beiträge verschwinden!

Ich versuche auch, einen Weg zu finden, vergangene Ereignisse im Back-End zu zeigen, und ich stecke auch dort fest! Ich bin mir nicht sicher, wie ich am besten vorgehen soll - vielleicht können Sie auf der Seite mit den Beiträgen zu Ereignissen zwischen vergangenen und zukünftigen Ereignissen wechseln.

Hilfe!!

2
Richard Sweeney

Zweiter Versuch: ;-)

pre_get_posts wird NACH parse_query() ausgeführt. parse_query() wandelt 'meta_key' etc. in 'meta_query' um. get_posts() scheint nicht direkt auf 'meta_key' etc. zu reagieren. Fügen Sie also $query->parse_query() nach Ihren $query->set()-Aufrufen hinzu oder verwenden Sie einen Filter, der vor parse_query ausgeführt wird (bearbeitet, der parse_query()-Filter funktioniert auch nicht - er wird zu spät ausgeführt).

Bearbeiten: Umschalten:

function my_timeswitch() {
    $operators = array(
        '>=' => 'future',
        '<=' => 'past'
    );
    ?>
    <select name='meta_compare'>
        <?php
            foreach ($operators as $k => $v) {
                printf( "<option %s value='%s'>%s</option>\n", selected($_GET['meta_compare'], $k, false), esc_attr($k), __($v));
            }
        ?>
    </select>
    <?php
}
add_action('restrict_manage_posts', 'my_timeswitch');

Dies kann allein funktionieren. Wenn nicht, müssen Sie den Namen in einen anderen Namen ändern, eine neue öffentliche Abfragevariable über den Filter query_vars registrieren und anschließend über den Filter parse_query darauf reagieren.

2
wyrfel

Verwenden Sie current_time('mysql') anstelle von time().

time() gibt einen Unix-Zeitstempel (das ist eine Ganzzahl) zurück, current_time('mysql') gibt einen MySQL-Zeitstempel zurück.

0
wyrfel