Adaugă meniu de filtrare în lista de articole din admin (pentru tipuri personalizate) pentru a filtra articolele după valorile câmpurilor personalizate
Acest răspuns este foarte apropiat de ceea ce încerc să realizez, dar aș dori să specific un câmp personalizat anume și să afișez un meniu dropdown cu valorile disponibile ale acestuia. Mulțumesc!

Simplu de realizat, mai întâi creează dropdown-ul doar cu valorile meta pe care le dorești și apoi prinde trimiterea filtrului, doar schimbă POST_TYPE
cu numele tipului tău de postare și META_KEY
cu numele cheii tale meta:
<?php
/*
Plugin Name: Admin Filter BY Custom Fields
Plugin URI: http://en.bainternet.info
Description: răspuns la http://wordpress.stackexchange.com/q/45436/2487
Version: 1.0
Author: Bainternet
Author URI: http://en.bainternet.info
*/
add_action( 'restrict_manage_posts', 'wpse45436_admin_posts_filter_restrict_manage_posts' );
/**
* Mai întâi creează dropdown-ul
* asigură-te că schimbi POST_TYPE cu numele tipului tău de postare personalizată
*
* @author Ohad Raz
*
* @return void
*/
function wpse45436_admin_posts_filter_restrict_manage_posts(){
$type = 'post';
if (isset($_GET['post_type'])) {
$type = $_GET['post_type'];
}
//adaugă filtrul doar la tipul de postare dorit
if ('POST_TYPE' == $type){
//schimbă aceasta cu lista de valori pe care dorești să le afișezi
//în formatul 'etichetă' => 'valoare'
$values = array(
'etichetă' => 'valoare',
'etichetă1' => 'valoare1',
'etichetă2' => 'valoare2',
);
?>
<select name="ADMIN_FILTER_FIELD_VALUE">
<option value=""><?php _e('Filtrează după ', 'wose45436'); ?></option>
<?php
$current_v = isset($_GET['ADMIN_FILTER_FIELD_VALUE'])? $_GET['ADMIN_FILTER_FIELD_VALUE']:'';
foreach ($values as $label => $value) {
printf
(
'<option value="%s"%s>%s</option>',
$value,
$value == $current_v? ' selected="selected"':'',
$label
);
}
?>
</select>
<?php
}
}
add_filter( 'parse_query', 'wpse45436_posts_filter' );
/**
* dacă este trimis, filtrează după meta postare
*
* asigură-te că schimbi META_KEY cu cheia meta reală
* și POST_TYPE cu numele tipului tău de postare personalizată
* @author Ohad Raz
* @param (wp_query object) $query
*
* @return Void
*/
function wpse45436_posts_filter( $query ){
global $pagenow;
$type = 'post';
if (isset($_GET['post_type'])) {
$type = $_GET['post_type'];
}
if ( 'POST_TYPE' == $type && is_admin() && $pagenow=='edit.php' && isset($_GET['ADMIN_FILTER_FIELD_VALUE']) && $_GET['ADMIN_FILTER_FIELD_VALUE'] != '') {
$query->query_vars['meta_key'] = 'META_KEY';
$query->query_vars['meta_value'] = $_GET['ADMIN_FILTER_FIELD_VALUE'];
}
}

Excelent! Am probleme în a face acest lucru să apară pe pagina mea de postare personalizată (type=contestentry). Poți verifica codul meu din functions.php, te rog? Este acesta preluat dintr-un plugin existent?

Nu ai modificat POST_TYPE
aici, încearcă asta: http://pastebin.com/tabUfh3Y

Funcționează! Mulțumesc @Bainternet! A trebuit să schimb și $type = 'post'; de la linia 65. Mulțumesc din nou!

:) Singurul lucru pe care nu trebuia să-l schimbi, e acolo în mod implicit, dar e în regulă și așa.

Ai vreo idee cum să elimin complet filtrul SHOW ALL DATES, astfel încât să apară doar filtrele mele personalizate pentru un anumit tip de postare?

@mike23 Am câteva site-uri cu același cod și totul funcționează în continuare perfect.

notă: poți dori să te asiguri că rulează doar pe interogarea principală $query->is_main_query()

SUPER TARE! Mulțumesc!!! Există vreo modalitate de a seta un filtru implicit? Gen când deschid lista, un filtru să fie deja selectat și lista să se încarce cu filtrul aplicat?

Acest răspuns funcționează perfect pe WordPress 4.9.5! A îmbătrânit foarte bine, mulțumesc!

Dacă folosești altă interogare în interiorul restrict_manage_posts
, asigură-te că adaugi && $query->is_main_query()
la declarația ta condițională din parse_query, altfel filtrul parse_query va interfera cu acea a doua interogare.
if ( 'POST_TYPE' == $type
&& is_admin()
&& $pagenow=='edit.php'
&& isset($_GET['ADMIN_FILTER_FIELD_VALUE'])
&& $_GET['ADMIN_FILTER_FIELD_VALUE'] != ''
&& $query->is_main_query()
) {
$query->query_vars['meta_key'] = 'META_KEY';
$query->query_vars['meta_value'] = $_GET['ADMIN_FILTER_FIELD_VALUE'];
}
