wake-up-neo.com

Ändere die Abfrage in edit.php

Was ist der beste Weg, um die Abfrage zu ändern, die auf dem Bildschirm "Beiträge bearbeiten" (edit.php) ausgeführt wird?

Die aktuelle Methode, die ich verwende, besteht darin, ein Argument wie folgt an die globale $ wp_query zu übergeben:

$wp_query->query( array ('category__in' => array(14,9,2) ) );

Dies funktioniert jedoch nicht wirklich wie erwartet, sobald die Benutzerseiten hin und her gefiltert oder durchsucht wurden.

3
user2607

Vor ein paar Tagen habe ich eine schnelle Lösung mit pre_get_posts filter geschrieben, um einige Seiten im Admin-Bereich auszublenden.
Vielleicht könnten Sie es als guten Ausgangspunkt für alles verwenden, was Sie erreichen möchten.

if ( is_admin() ) add_filter('pre_get_posts', 'mau_filter_admin_pages');

function mau_filter_admin_pages($query) {
     $query->set('post__not_in', array(1,2,3) );
     // Do not display posts with IDs 1, 2 and 3 in the admin area.
     return $query;
}

Aber seien Sie vorsichtig: pre_get_posts betrifft fast alle Post-Abfragen auf Ihrer Site. Sie müssen einige Bedingungen verwenden, damit es nur dort funktioniert, wo es gewünscht wird. if (is_admin()) hat mir gereicht, aber wie gesagt, es war eine schnelle Lösung und ich habe es noch nicht richtig getestet.

Ich bin sicher, dass ein lokaler wp-Ninja dies korrigiert, wenn es zu schmutzig ist.)

3
Michal Mau

Ich bin sicher, dass ein lokaler wp-Ninja dies korrigiert, wenn es zu schmutzig ist.)

Es ist kein schlechter Ansatz, aber ich kann einige Hinweise zur Verbesserung der Funktion geben, lesen Sie weiter ...

Nachdem ich in der Vergangenheit viele Beispiele für die Verwendung von pre_get_posts gegeben habe, hat sich herausgestellt, dass pre_get_posts auf einer bestimmten Seite tatsächlich mehrmals ausgeführt werden kann (zumindest wurde mir dies mitgeteilt und ich habe es gelesen), und dies kann bedeuten, dass Ihre Rückruffunktion manchmal ausgeführt wird wird mehrmals aufgerufen (wenn dies nicht erforderlich ist).

Anstatt pre_get_posts zu verwenden, besteht eine Alternative darin, parse_query zu verwenden, der direkt am Ende des Abfrageobjekts ausgeführt wird und immer nur einmal ausgeführt wird, wobei Sie dennoch die Kontrolle über die Abfrageparameter erhalten, die Sie benötigen.

Wie ich auch in den Kommentaren zu mauglys Antwort erwähnt habe, wird pre_get_posts für so ziemlich alle Post-Abfragen auf Ihrer Website ausgeführt. Wenn Sie diesem Hook Filter/Aktionen hinzufügen, müssen Sie daher sicherstellen, dass der Filter nicht ausgeführt wird wenn es nicht gewollt ist. Ich sage fast alle Abfragen, weil es einen Parameter gibt, der für eine bestimmte Nachabfrage festgelegt werden kann, um Filter zu umgehen (suppress_filters, wenn ich mich richtig erinnere).

WordPress setzt verschiedene Admin-Variablen in admin.php für jede Seite, damit Sie (und der Kerncode) bestimmen können, welche Art von Seite zu einem bestimmten Zeitpunkt angezeigt wird. Einige von ihnen sind .. .

$pagenow
$parent_file
$plugin_page
$submenu_file
$typenow

Diese Variablen enthalten genügend Informationen zu jeder Administratorseite, um das Ausführen eines Filters oder einer Aktion auf einer ausgewählten Seite oder ausgewählten Seiten ganz einfach zu machen.

Sie können sehen, wie diese Variablen hier in der Quelle definiert sind.
http://core.trac.wordpress.org/browser/tags/3.0.4/wp-admin/admin.php

Im Falle der Postauflistung können wir erwarten, dass $pagenow edit.php ist und $typenow seltsamerweise leer ist (nur wenn der Posttyp post ist).

Sie können diesen Filter unter bestimmten Bedingungen zur Abfrage hinzufügen, indem Sie eine bedingte Logik verwenden, um die Seite wie folgt zu bearbeiten ...

add_action( 'admin_init', 'possibly_add_exclude_filter' );
function possibly_add_exclude_filter() {
    global $pagenow, $typenow;
    if( 'edit.php' == $pagenow && '' == $typenow ) 
        add_action( 'parse_query', 'set_viewable_posts_by_cat' );
}
function set_viewable_posts_by_cat() {
      set_query_var('category__in', array(1) );
      return;
}

Ich hoffe das ist hilfreich .. :)

4
t31os