Cum se filtrează lista de articole (în tabloul de bord WordPress) folosind un câmp personalizat (funcționalitate de căutare)?
În ciuda faptului că am căutat mult pe Google, nu am găsit răspunsul la o întrebare foarte simplă:
Am câteva articole cu un câmp personalizat (de exemplu supplier_name). Aș dori să pot căuta și filtra articolele mele în funcție de acest câmp personalizat. Cu alte cuvinte, în lista de articole din panoul de administrare, aș dori să am o casetă de căutare (numită "Nume furnizor") unde pot introduce o valoare (ex. "IBM") și apoi, să fac clic pe un buton de căutare care îmi va returna toate articolele care au un câmp personalizat numit "supplier_name" și, dacă există, valoarea câmpului personalizat va fi "IBM".
Cum pot face acest lucru?
Am codat un plugin special pentru asta și nu am apucat să-l public:
Cum se utilizează:
În meniul derulant veți găsi o listă cu toate câmpurile personalizate disponibile. Selectați câmpul după care doriți să filtrați și apăsați butonul de filtrare. Dacă doriți să filtrați după o anumită valoare a unui câmp personalizat, selectați numele câmpului, introduceți valoarea dorită și apăsați filtrare.
<?php
/*
Plugin Name: Admin Filter BY Custom Fields
Plugin URI: http://en.bainternet.info
Description: Filtrează postările sau paginile în panoul de administrare după câmpuri personalizate (post meta)
Version: 1.0
Author: Bainternet
Author URI: http://en.bainternet.info
*/
add_filter( 'parse_query', 'ba_admin_posts_filter' );
add_action( 'restrict_manage_posts', 'ba_admin_posts_filter_restrict_manage_posts' );
function ba_admin_posts_filter( $query )
{
global $pagenow;
if ( is_admin() && $pagenow=='edit.php' && isset($_GET['ADMIN_FILTER_FIELD_NAME']) && $_GET['ADMIN_FILTER_FIELD_NAME'] != '') {
$query->query_vars['meta_key'] = $_GET['ADMIN_FILTER_FIELD_NAME'];
if (isset($_GET['ADMIN_FILTER_FIELD_VALUE']) && $_GET['ADMIN_FILTER_FIELD_VALUE'] != '')
$query->query_vars['meta_value'] = $_GET['ADMIN_FILTER_FIELD_VALUE'];
}
}
function ba_admin_posts_filter_restrict_manage_posts()
{
global $wpdb;
$sql = 'SELECT DISTINCT meta_key FROM '.$wpdb->postmeta.' ORDER BY 1';
$fields = $wpdb->get_results($sql, ARRAY_N);
?>
<select name="ADMIN_FILTER_FIELD_NAME">
<option value=""><?php _e('Filtrează după câmpuri personalizate', 'baapf'); ?></option>
<?php
$current = isset($_GET['ADMIN_FILTER_FIELD_NAME'])? $_GET['ADMIN_FILTER_FIELD_NAME']:'';
$current_v = isset($_GET['ADMIN_FILTER_FIELD_VALUE'])? $_GET['ADMIN_FILTER_FIELD_VALUE']:'';
foreach ($fields as $field) {
if (substr($field[0],0,1) != "_"){
printf
(
'<option value="%s"%s>%s</option>',
$field[0],
$field[0] == $current? ' selected="selected"':'',
$field[0]
);
}
}
?>
</select> <?php _e('Valoare:', 'baapf'); ?><input type="TEXT" name="ADMIN_FILTER_FIELD_VALUE" value="<?php echo $current_v; ?>" />
<?php
}

De ce să nu folosești funcția helper pentru caseta ta de selecție? Adică, înlocuiește $field[0] == $current? ' selected="selected"':'',
cu selected( $field[0] == $current, true, false ),
... :)

Există vreo modalitate să faci să funcționeze în cele mai noi versiuni de WordPress?

Am o tabelă personalizată (Nume tabelă: ssl_transaction_cus) în baza de date care este folosită pentru stocarea informațiilor despre donații. Am preluat toate datele din această tabelă într-o 'pagină de meniu admin' cu un tabel (cu tag-ul Table). Aș dori să pot filtra aceste date în funcție de 'Numele Evenimentului'.
Încerc să fac asta conform acestui răspuns. Dar, există cod pentru postări personalizate sau postări obișnuite. În cazul meu, nu am CPT pentru aceste date, ci doar date personalizate. Încerc de mult timp, dar nu am reușit. Te rog să arunci o privire https://wordpress.stackexchange.com/questions/408599/how-to-filter-with-dropdown-in-backend-for-custom-data
