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

Published by Marcin Pietrzak

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis nec ante nec lectus laoreet feugiat. Donec aliquet justo in tellus gravida, id elementum magna convallis. Curabitur faucibus mauris sed risus egestas lobortis. Nunc vestibulum elit ac ipsum ultricies, non ultrices lorem ultrices. Nam at dolor id elit lobortis ullamcorper. Fusce commodo turpis nisi, efficitur efficitur libero dictum eget. Morbi viverra dignissim lacus. Vestibulum mi justo, dictum ut iaculis eget, scelerisque et nibh.