So sortieren Sie den Administratorbereich eines WordPress -benutzerdefinierten Post -Typs nach einem benutzerdefinierten Feld

wordpress.stackexchange https://wordpress.stackexchange.com/questions/45

  •  16-10-2019
  •  | 
  •  

Frage

Wenn Sie einen meiner benutzerdefinierten Beitragstypen bearbeiten, möchte ich alle Einträge anstelle des Datums, das sie veröffentlicht werden, alle Einträge über ein benutzerdefiniertes Feld auflisten können (was für einen benutzerdefinierten Beitragstyp wahrscheinlich nicht relevant ist). Ich habe einen Vorsprung aus den Kommentaren eines Blog -Beitrags über benutzerdefinierte Post -Typen erhalten und der Autor sagte, es sei möglich und er habe es sogar geschafft, damit Sie auf die Spaltennamen für eine benutzerdefinierte Sortierung klicken können. Er erwähnte das posts_orderby Funktion, die ich in meinen eigenen Kommentaren bemerkte, aber jetzt kann ich den Blog -Beitrag mehr finden. Irgendwelche Vorschläge? Ich habe eine Lösung gesehen, die verwendet wurde

add_action('wp', 'check_page');

Und die check_page Funktion verwendet add_filter Um die Abfrage zu ändern, aber ich bin mir ziemlich sicher, dass sie nur in den Themendateien funktionieren würde, nicht im Administratorbereich.

War es hilfreich?

Lösung

Wie Sie sich wahrscheinlich durch den Mangel an Antworten vorstellen können, ist die Lösung nicht gerade trivial. Was ich getan habe, ist ein etwas in sich geschlossenes Beispiel zu erstellen, das einen benutzerdefinierten postentypen annimmt "movie"und benutzerdefinierte Feldschlüssel von"Genre".

Haftungsausschluss: Dies funktioniert mit WP3.0, aber ich kann nicht sicher sein, dass es mit früheren Versionen funktioniert.

Sie müssen im Grunde zwei (2) Haken anschließen, damit es funktioniert, und zwei weitere (2), um es offensichtlich und nützlich zu machen.

Der erste Haken ist 'restrict_manage_posts'Mit dem können Sie eine HTML ausgeben <select> im Bereich über der Liste der Beiträge, in denen das "Massenaktionen" und "Showdaten"Filter. Der angegebene Code generiert das"Sortieren nach:"Funktionalität, wie in diesem Bildschirmausschnitt zu sehen ist:

How to Create Sort By functionality for a Custom Post Type in the WordPress Admin
(Quelle: mikeschinkel.com)

Der Code verwendet direkt SQL, da keine WordPress -API -Funktion vorhanden ist, um die Liste aller Meta_Keys für einen Post -Typen anzugeben (klingt nach einer Zukunft Trac Ticket für mich ...) Wie auch immer, hier ist der Code. Beachten Sie, dass es den Post -Typ abgreift $_GET und validiert, um sicherzustellen, dass es sich sowohl um einen gültigen Postyp handelt post_type_exists() sowie ein movie Post-Typ (diese beiden Schecks sind übertrieben, aber ich habe es getan, um Ihnen zu zeigen, wie ich den Post-Typ nicht harte Code haben möchten.) Schließlich verwende ich die sortby URL -Parameter, da er in WordPress nichts anderes in Konflikt steht:

add_action('restrict_manage_posts','restrict_manage_movie_sort_by_genre');
function restrict_manage_movie_sort_by_genre() {
    if (isset($_GET['post_type'])) {
        $post_type = $_GET['post_type'];
        if (post_type_exists($post_type) && $post_type=='movie') {
            global $wpdb;
            $sql=<<<SQL
SELECT pm.meta_key FROM {$wpdb->postmeta} pm
INNER JOIN {$wpdb->posts} p ON p.ID=pm.post_id
WHERE p.post_type='movie' AND pm.meta_key='Genre'
GROUP BY pm.meta_key
ORDER BY pm.meta_key
SQL;
            $results = $wpdb->get_results($sql);
            $html = array();
            $html[] = "<select id=\"sortby\" name=\"sortby\">";
            $html[] = "<option value=\"None\">No Sort</option>";
            $this_sort = $_GET['sortby'];
            foreach($results as $meta_key) {
                $default = ($this_sort==$meta_key->meta_key ? ' selected="selected"' : '');
                $value = esc_attr($meta_key->meta_key);
                $html[] = "<option value=\"{$meta_key->meta_key}\"$default>{$value}</option>";
            }
            $html[] = "</select>";
            echo "Sort by: " . implode("\n",$html);
        }
    }
}

Der zweite erforderliche Schritt besteht darin, die zu verwenden parse_query Haken, der nach WordPress bezeichnet wird, entscheidet eine Abfrage, die ausgeführt werden sollte, aber bevor sie die Abfrage ausführt. Hier können wir Werte von festlegen orderby und meta_key in der Abfrage query_var Array, die sind im Codex dokumentiert in dem orderby Parameter für query_posts(). Wir testen, um sicherzustellen:

  1. Wir sind im Administrator (is_admin()),
  2. Wir sind auf der Seite, auf der Beiträge im Administrator aufgeführt sind ($pagenow=='edit.php'),
  3. Die Seite wurde mit einem aufgerufen post_type URL -Parameter gleich gleich movie, und
  4. Die Seite wurde auch mit einem aufgerufen sortby URL -Parameter und dass es nicht übergeben wurde.Keiner'

Wenn all diese Tests bestehen, setzen wir die dann die query_vars (Wie dokumentiert hier) zu meta_value und unser sortby Wert für 'Genre':

add_filter( 'parse_query', 'sort_movie_by_meta_value' );
function sort_movie_by_meta_value($query) {
    global $pagenow;
    if (is_admin() && $pagenow=='edit.php' &&
        isset($_GET['post_type']) && $_GET['post_type']=='movie' && 
        isset($_GET['sortby'])  && $_GET['sortby'] !='None')  {
        $query->query_vars['orderby'] = 'meta_value';
        $query->query_vars['meta_key'] = $_GET['sortby'];
    }
}

Und das ist alles, was Sie tun müssen; nein "posts_order" oder "wp"Haken benötigt! Natürlich müssen Sie tatsächlich mehr tun. Sie müssen einige Spalten auf Ihrer Seite hinzufügen, in der die Beiträge aufgeführt sind, damit Sie tatsächlich die Werte sehen können, die sie sortieren, ansonsten werden die Benutzer mucho verwirrt. manage_{$post_type}_posts_columns Hook, in diesem Fall manage_movie_posts_columns. Dieser Haken wird durch das Standardarray von Spalten übergeben und ich habe ihn zum Einfachheit halber durch zwei Standardspalten ersetzt. ein Kontrollkästchen (cb) und ein Postname (title). (Sie können inspizieren posts_columns mit einer print_r() Um zu sehen, was standardmäßig sonst noch verfügbar ist.)

Ich beschloss, eine "hinzuzufügen"Sortiert nach:"Denn wenn es ein gibt sortby URL -Parameter und wenn dies nicht der Fall ist None:

add_action('manage_movie_posts_columns', 'manage_movie_posts_columns');
function manage_movie_posts_columns($posts_columns) {
    $posts_columns = array(
        'cb' => $posts_columns['cb'],
        'title' => 'Movie Name',
        );
    if (isset($_GET['sortby']) && $_GET['sortby'] !='None') 
        $posts_columns['meta_value'] = 'Sorted By';

    return $posts_columns;
}

Endlich benutzen wir das manage_pages_custom_column Haken, um den Wert tatsächlich anzuzeigen, wenn es einen Beitrag des entsprechenden Post -Typs gibt und mit dem wahrscheinlich redundanten Test für is_admin() und $pagenow=='edit.php'. Wenn es ein gibt sortby URL -Parameter Wir extrahieren den benutzerdefinierten Feldwert, der nach einer Anzeige in unserer Liste sortiert wird. So sieht es aus (denken Sie daran, dies sind Testdaten, also keine Kommentare aus der Erdnussgalerie zu den Filmklassifikationen! :):

Custom Columns added for a Custom Post Type in the WordPress Admin
(Quelle: mikeschinkel.com)

Und hier ist der Code:

add_action('manage_pages_custom_column', 'manage_movie_pages_custom_column',10,2);
function manage_movie_pages_custom_column($column_name,$post_id) {
    global $pagenow;
    $post = get_post($post_id);
    if ($post->post_type=='movie' && is_admin() && $pagenow=='edit.php')  {
        switch ($column_name) {
            case 'meta_value':
                if (isset($_GET['sortby']) && $_GET['sortby'] !='None') {
                    echo get_post_meta($post_id,$_GET['sortby'],true);
                }
                break;
        }
    }
}

Beachten Sie, dass dies nur das erste aufnimmt "Genre" Für ein movie, dh der erste meta_value im Fall von mehreren Werten für einen bestimmten Schlüssel. Aber andererseits bin ich mir nicht sicher, wie es sonst funktionieren würde!

Und für diejenigen, die nicht vertraut sind, wo Sie diesen Code einsetzen können, können Sie ihn in ein Plugin oder wahrscheinlicher für den Neuling in der functions.php Datei in Ihrem aktuellen Thema.

Wie das hilft.

Andere Tipps

Ab WordPress 3.1 (ich verwende die Beta) können Spalten jetzt über ihre Titel sortierbar sein.

Im folgenden Beitrag werden beschrieben, wie sie implementiert werden.

http://sccribu.net/wordpress/custom-sortable-columns.html

Hier ist eine einfache Lösung:

/* --------Sortable Events on Dashboard - show start date, time, venue--------- */

/*-------------------------------------------------------------------------------
    Custom Columns
-------------------------------------------------------------------------------*/

function my_*YOUR POST TYPE*_columns($columns)
{
    $columns = array(
        'cb'        => '<input type="checkbox" />',
        'title'     => 'Title',
        'your_custom_field'     => 'Custom Field Name',          
        'date'      =>  'Date',
    );
    return $columns;
}

function my_custom_columns($column)
{
    global $post;
    if($column == 'your_custom_field')
    {
        if(get_post_meta($post->ID, 'your_custom_field', true);)
        {
            echo get_post_meta($post->ID, 'your_custom_field', true);
        }
    }

}

add_action("manage_posts_custom_column", "my_custom_columns");
add_filter("manage_edit-*YOUR POST TYPE*_columns", "my_events_columns");

/*-------------------------------------------------------------------------------
    Sortable Columns
-------------------------------------------------------------------------------*/

function my_column_register_sortable( $columns )
{
    $columns['your_custom_field'] = 'your_custom_field';
    return $columns;
}

add_filter("manage_edit-*YOUR POST TYPE*_sortable_columns", "my_column_register_sortable" );

Einfach ersetzen Ihr Post -Typ und 'your_custom_field'

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit wordpress.stackexchange
scroll top