WordPress: filtrowanie w panelu listy postów
- Piotr Bartczak
- 2 mar 2011
- 1 minut(y) czytania
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
Comments