WordPress: filtrowanie w panelu listy postów

Swojego czasu na tym blogu były wpisy z serii poradnik webmastera w którym większość wpisów oznaczałem polem, wykorzystującym dodatkowe pola wpisu pokazując „poziom” zaawansowania danego tematu. Postów powstało na tyle dużo, że chciałbym je móc filtrować w panelu administratora, wyświetlając te o określonym poziomie.

Poniższy kod, który można wkleić do pliku functions.php w używanym przez nas motywie.

Niezłym żartem jest fakt, że poniższy kod został dostosowany do wersji 3.1 w której zmienił się sposób wybierania custom field’ów z pary parametrów „meta_key” i „meta_value” na array „meta_query„. W załączniku jest też wersja działająca ze starszym wordpress’em. A zmiana jest bardzo dobra, bo wcześniej można było filtrować w WP Query tylko po jednym polu meta i to tylko dokładne dopasowanie. Aktualnie można wiele oraz co lepsze, można dać różne typy dopasowania. Dla zainteresowanych i zaawansowanych opis parametru meta_query na codex.wordpress.org.

W użytym przykładzie zmiana definicji IWORKS_FIELD_NAME spowoduje wybieranie innego pola o podanej nazwie.

<?php
/**
 * filtrowanie w panelu listy postów
 */
define("IWORKS_FIELD_NAME", "level");
 
add_filter( "parse_query", "iworks_level_filter" );
add_action( "restrict_manage_posts", "iworks_level_restrict_manage_posts" );
 
function iworks_level_filter( $query )
{
    global $pagenow;
    if ( is_admin()&& $pagenow=="edit.php" && isset($_GET[IWORKS_FIELD_NAME]) && $_GET[IWORKS_FIELD_NAME] != "") {
        $query->query_vars["meta_query"] = array (
            array (
                "key"     => IWORKS_FIELD_NAME,
                "value"   => $_GET[IWORKS_FIELD_NAME],
                "compare" => "IN",
                "type"    => "DECIMAL"
            )
        );
    }
}
 
function iworks_level_restrict_manage_posts()
{
    global $wpdb;
    $sql = "SELECT DISTINCT meta_value FROM ".$wpdb->postmeta." WHERE meta_key = \"".IWORKS_FIELD_NAME."\" ORDER BY 1";
    $fields = $wpdb->;get_results($sql, ARRAY_N);
    $current = isset($_GET[IWORKS_FIELD_NAME])? $_GET[IWORKS_FIELD_NAME]:"";
    foreach ($fields as $field) {
        printf
        (
            "%s",
            $field[0],
            $field[0] == $current? " selected="selected"":"",
            $field[0]
        );
}
?>

Paczka do pobrania zawiera dwa pliki, jeden działa dla wersji 3.1 drugi dla 3.0.

pobierz plik: functions-iworks-posts-filter.zip