it-swarm-eu.dev

Jak řadit oblast admin vlastního typu příspěvku WordPress podle vlastního pole

Při úpravách jednoho z mých vlastních typů příspěvků chci být schopen zobrazit všechny položky podle vlastního pole namísto data, kdy jsou publikovány (což pro typ vlastního příspěvku pravděpodobně není relevantní). Mám náskok z komentářů blogu o vlastních typech příspěvků a autor řekl, že je to možné a že to dokonce udělal, abyste mohli kliknout na názvy sloupců pro vlastní řazení. Zmínil se o posts_orderby funkci, kterou jsem si poznamenal ve svých vlastních poznámkách, ale nyní mohu najít blogový příspěvek. Nějaké návrhy? Viděl jsem jedno řešení

add_action('wp', 'check_page');

Použitá funkce check_pageadd_filter pro změnu dotazu, ale jsem si jistá, že bude fungovat pouze v souborech motivů, nikoli v oblasti admin.

52
tooshel

Vzhledem k tomu, že si můžete představit nedostatek odpovědí, řešení není zrovna triviální. To, co jsem udělal, je vytvoření poněkud samostatného příkladu, který předpokládá vlastní typ příspěvku "movie" a vlastní klíč pole "žánr".

Disclaimer: to funguje s WP3.0, ale nemohu si být jistý, že to bude fungovat s dřívějšími verzemi.

V podstatě je třeba zavěsit dva (2) háky, aby fungovaly, a další dva (2), aby bylo zřejmé a užitečné.

První háček je 'restrict_manage_posts', který vám umožní vydat HTML <select> v oblasti nad seznamem příspěvků, kde filtry "Hromadné akce" a "Zobrazit data" filtrují. Uvedený kód vygeneruje funkci "Seřadit podle:", jak je vidět na tomto fragmentu obrazovky:

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

Kód používá přímý SQL, protože tam není funkce WordPress API poskytnout seznam všech meta_keys pro typy příspěvků (zní jako budoucnost trac ticket to me ...) Každopádně, tady je kód. Všimněte si, že chytí typ příspěvku z $_GET a ověřuje, zda je to jak platný typ příspěvku post_type_exists(), tak i movie typ příspěvku (tyto dvě kontroly jsou nadměrné, ale udělal jsem to, abych vám ukázal, jak chcete, hard-kód typu příspěvku.) Nakonec používám parametr sortby URL, protože není v rozporu s ničím jiným v programu WordPress:

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

Druhým požadovaným krokem je použití háčku parse_query, který se nazývá po WordPress rozhodne, který dotaz má spustit, ale před spuštěním dotazu. Zde se dostaneme k nastavení hodnot orderby a meta_key do pole query_var dotazu, které jsou zdokumentovány v Codexu v parametru orderby pro query_posts(). Testujeme, zda:

  1. Jsme v admin (is_admin()),
  2. Jsme na stránce, která uvádí příspěvky v admin ($pagenow=='edit.php'),
  3. Stránka byla volána s parametrem post_type URL rovným movie a
  4. Stránka byla také volána pomocí parametru sortby URL a nebyla předána hodnota 'None'

Pokud všechny tyto testy projdou, pak nastavíme query_vars (jak je zdokumentováno zde ) na meta_value a naši hodnotu sortby pro 'žánr':

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'];
    }
}

A to je vše, co musíte udělat; nejsou vyžadovány žádné háčky "posts_order" nebo "wp"! Samozřejmě musíte udělat více; je třeba přidat několik sloupců na stránce, která obsahuje seznam příspěvků, takže můžete skutečně vidět hodnoty, které třídí, jinak se uživatelé dostanou zmateně. Takže přidejte manage_{$post_type}_posts_columns hook, v tomto případě manage_movie_posts_columns. Tento háček prochází standardním sloupcem sloupců a pro jednoduchost jsem ho nahradil dvěma standardními sloupci; zaškrtávací políčko (cb) a název příspěvku (title). (posts_columns můžete zkontrolovat pomocí print_r() a zjistit, co je ve výchozím nastavení dostupné.)

Rozhodl jsem se přidat slovo „Seřazeno podle:“ pro případ, kdy je parametr sortby URL nastaven a když není 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;
}

Nakonec použijeme háček manage_pages_custom_column, abychom ve skutečnosti zobrazili hodnotu, když je post příslušného typu příspěvku a pravděpodobně nadbytečný test pro is_admin() a $pagenow=='edit.php'. Pokud existuje parametr sortby URL, extrahujeme vlastní hodnotu pole, která se třídí podle zobrazení v našem seznamu. Zde je to, jak to vypadá (nezapomeňte, že se jedná o zkušební data, takže žádné komentáře z galerie arašídů o klasifikaci filmu!):

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

A tady je kód:

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;
        }
    }
}

Všimněte si, že toto pouze vybírá první "žánr" pro movie, tj. První meta_hodnotu v případě více hodnot pro daný klíč. Ale pak si nejsem jistý, jak by to fungovalo jinak!

A pro ty, kteří nejsou obeznámeni s umístěním tohoto kódu, ho můžete umístit do pluginu nebo s větší pravděpodobností pro nováčka v souboru functions.php ve vašem aktuálním tématu.

Jak to pomáhá.

66
MikeSchinkel

Jak WordPress 3.1 (používám beta) sloupce mohou nyní být mezi jejich názvy.

Následující příspěvek popisuje, jak je implementovat.

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

8
Leo Plaw