Adaugă meniu de filtrare în lista de articole din admin (pentru tipuri personalizate) pentru a filtra articolele după valorile câmpurilor personalizate

13 mar. 2012, 16:27:30
Vizualizări: 86.9K
Voturi: 56

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!

1
Comentarii

@soulseekah nu este legal să ceri indicații înainte de a încerca ceva?

frnhr frnhr
14 sept. 2013 16:33:06
Toate răspunsurile la întrebare 3
13
88

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'];
    }
}
13 mar. 2012 17:02:23
Comentarii

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?

http://pastebin.com/BJMua8nq

adam5280 adam5280
13 mar. 2012 17:57:23

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

Bainternet Bainternet
13 mar. 2012 18:02:06

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

adam5280 adam5280
13 mar. 2012 18:12:39

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

Bainternet Bainternet
13 mar. 2012 18:22:05

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?

RailsTweeter RailsTweeter
22 mai 2014 20:04:04

@RailsTweeter pune-o ca o întrebare nouă.

Bainternet Bainternet
23 mai 2014 03:37:47

Este încă cea mai bună metodă de a face asta cu WP 4?

mike23 mike23
11 sept. 2014 12:40:53

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

Bainternet Bainternet
11 sept. 2014 15:42:45

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

jsweazy jsweazy
30 nov. 2017 20:09:18

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?

fdrv fdrv
9 feb. 2018 19:52:07

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

Davey Davey
11 apr. 2018 14:22:41

Soluție excelentă! Mersi!

Diego Somar Diego Somar
16 nov. 2018 20:37:38

Este wose45436 o greșeală de tastare sau este intenționat diferit de wpse45436?

Pikamander2 Pikamander2
31 dec. 2021 13:10:30
Arată celelalte 8 comentarii
0

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'];
}
30 nov. 2018 20:06:15
0

Dacă trebuie să adăugați mai multe câmpuri, trebuie să le adăugați la interogare

$query->query_vars['meta_query'][] = array(
    'key'     => 'KEY',
    'value'   => $_GET['FIELD'],
    'compare' => 'LIKE'
);
12 iul. 2019 12:52:53