WooCommerce - Filtrare i prodotti in evidenza nell'area di amministrazione
WooCommerce offre un modo semplice per selezionare i prodotti "In evidenza" cliccando sull'icona a forma di stella nella colonna "In evidenza" nell'area di amministrazione.
Ho bisogno di poter filtrare e visualizzare solo i prodotti in evidenza nell'area di amministrazione. Qualcuno conosce un modo semplice per farlo?
Dopo alcune ricerche ho scoperto che questo viene gestito tramite meta key/values, dove _featured
è la chiave e il valore può essere yes
o no
.
Sfortunatamente, poiché non viene utilizzata una tassonomia come le categorie prodotto, non è possibile usare la funzionalità di filtro nell'area di amministrazione per mostrare solo i prodotti in evidenza. Puoi ordinare la colonna "In evidenza" per raggrupparli tutti in cima o in fondo alla lista prodotti, ma è tutto qui.
Puoi ordinare la lista dei prodotti in base allo stato "in evidenza". Basta cliccare sulla stella in cima alla colonna... un clic posizionerà tutti gli elementi non in evidenza in cima, mentre due clic invertiranno l'ordine mostrando prima i prodotti in evidenza.
L'URL nell'area di amministrazione sarà simile a:
/wp-admin/edit.php?post_type=product&orderby=featured&order=desc
AGGIORNAMENTO:
Ok, si è scoperto che filtrare per stato "in evidenza" non è così difficile. WooCommerce filtra per "sottotipo", e poiché questo avviene anche attraverso i meta, possiamo sostanzialmente copiare il loro codice apportando qualche modifica.
La prima funzione aggiunge l'elemento select/drop-down, mentre la seconda gestisce le modifiche alla query di amministrazione.
/**
* Filtra i prodotti per tipo
*
* @access public
* @return void
*/
function wpa104537_filter_products_by_featured_status() {
global $typenow, $wp_query;
if ($typenow=='product') :
// In evidenza/Non in evidenza
$output .= "<select name='featured_status' id='dropdown_featured_status'>";
$output .= '<option value="">'.__( 'Mostra tutti gli stati "in evidenza"', 'woocommerce' ).'</option>';
$output .="<option value='featured' ";
if ( isset( $_GET['featured_status'] ) $output .= selected('featured', $_GET['featured_status'], false);
$output .=">".__( 'In evidenza', 'woocommerce' )."</option>";
$output .="<option value='normal' ";
if ( isset( $_GET['featured_status'] ) ) $output .= selected('normal', $_GET['featured_status'], false);
$output .=">".__( 'Non in evidenza', 'woocommerce' )."</option>";
$output .="</select>";
echo $output;
endif;
}
add_action('restrict_manage_posts', 'wpa104537_filter_products_by_featured_status');
/**
* Filtra i prodotti nell'area di amministrazione in base alle opzioni
*
* @access public
* @param mixed $query
* @return void
*/
function wpa104537_featured_products_admin_filter_query( $query ) {
global $typenow, $wp_query;
if ( $typenow == 'product' ) {
// Sottotipi
if ( ! empty( $_GET['featured_status'] ) ) {
if ( $_GET['featured_status'] == 'featured' ) {
$query->query_vars['meta_value'] = 'yes';
$query->query_vars['meta_key'] = '_featured';
} elseif ( $_GET['featured_status'] == 'normal' ) {
$query->query_vars['meta_value'] = 'no';
$query->query_vars['meta_key'] = '_featured';
}
}
}
}
add_filter( 'parse_query', 'wpa104537_featured_products_admin_filter_query' );
Aggiornato per WooCommerce 3.0
La callback parse_query
deve essere aggiornata poiché lo stato "in evidenza" non è più memorizzato come post meta.
/**
* Filtra i prodotti nell'area di amministrazione in base alle opzioni
*
* @access public
* @param mixed $query
* @return void
*/
function wpa104537_featured_products_admin_filter_query( $query ) {
global $typenow;
if ( $typenow == 'product' ) {
// Sottotipi
if ( ! empty( $_GET['featured_status'] ) ) {
if ( $_GET['featured_status'] == 'featured' ) {
$query->query_vars['tax_query'][] = array(
'taxonomy' => 'product_visibility',
'field' => 'slug',
'terms' => 'featured',
);
} elseif ( $_GET['featured_status'] == 'normal' ) {
$query->query_vars['tax_query'][] = array(
'taxonomy' => 'product_visibility',
'field' => 'slug',
'terms' => 'featured',
'operator' => 'NOT IN',
);
}
}
}
}
add_filter( 'parse_query', 'wpa104537_featured_products_admin_filter_query' );

Grazie. Come ho notato nell'ultima frase della mia domanda, sono a conoscenza di quella funzione di ordinamento. Tuttavia, desidero utilizzare la funzione "Ordina Prodotti", che consente l'ordinamento tramite drag and drop, per ordinare i Prodotti in Evidenza, cosa non possibile di default.
Puoi filtrare per categoria, poi cliccare su "Ordina Prodotti" e trascinarli nell'ordine desiderato. Vorrei questa funzionalità per i prodotti in evidenza...

Oggi stavo proprio leggendo un articolo su come le persone non leggano interamente gli articoli sul web, sembra che tu mi abbia beccato. Controlla la mia modifica.

Sembra che stessi trovando la mia soluzione mentre tu postavi la tua, e sembrano simili. Grazie!

Sì, sembra che stiamo facendo la stessa cosa. Una modifica carina... potrei usarla anche sui miei siti.

In WordPress (4.7.5) e WooCommerce (3.0.7), il tuo codice non funziona.

Beh, è vecchio di 4 anni e WooCommerce ha subito una massiccia revisione con la versione 3.0. L'ho aggiornato e sembra funzionare.

Grazie mille! Parte del nuovo codice è all'esterno. Ti suggerisco di controllarlo.

@helgatheviking Sei fantastico! Grazie per questo; funziona perfettamente in WP 4.8.3 e WC 3.1.2

Ho trovato questo plugin: https://wordpress.stackexchange.com/a/45447/15190, che sono riuscito a personalizzare per fornire una lista di selezione per filtrare i prodotti in evidenza. Con questo, sono in grado di utilizzare la funzionalità "Ordina prodotti" di WooCommerce tramite drag and drop per modificare facilmente l'ordine in cui i prodotti in evidenza appaiono nel widget Prodotti in evidenza e in altri contesti.
Ecco il codice con le mie personalizzazioni che lo renderà funzionante per i Prodotti in evidenza di WooCommerce:
<?php
/*
Plugin Name: Filtro Admin per Prodotti in Evidenza WooCommerce
Plugin URI: http://en.bainternet.info
Description: adattato da https://wordpress.stackexchange.com/q/45436/2487. Consente di visualizzare solo i prodotti in evidenza, permettendo poi di ordinarli tramite drag and drop
Version: 1.0
Author: Bainternet
Author URI: http://en.bainternet.info
*/
add_action( 'restrict_manage_posts', 'wpse45436_admin_posts_filter_restrict_manage_posts' );
/**
* Prima crea il menu a discesa
*
* @author Ohad Raz
*
* @return void
*/
function wpse45436_admin_posts_filter_restrict_manage_posts(){
$type = 'post';
if (isset($_GET['post_type'])) {
$type = $_GET['post_type'];
}
//applica il filtro solo al tipo di post desiderato
if ('product' == $type){
//modifica questo con l'elenco di valori che vuoi mostrare
//in formato 'etichetta' => 'valore'
$values = array(
'Mostra solo prodotti in evidenza' => 'Yes',
'Mostra solo prodotti non in evidenza' => 'No',
);
?>
<select name="Featured">
<option value=""><?php _e('Mostra prodotti in evidenza e non', 'wpse45436'); ?></option>
<?php
$current_v = isset($_GET['Featured'])? $_GET['Featured']:'';
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' );
/**
* Se inviato, filtra per meta del post
*
* @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 ( 'product' == $type && is_admin() && $pagenow=='edit.php' && isset($_GET['Featured']) && $_GET['Featured'] != '') {
$query->query_vars['meta_key'] = '_featured';
$query->query_vars['meta_value'] = $_GET['Featured'];
}
}

Non dimenticare di selezionare una delle nostre risposte come risposta ufficiale per rimuovere questa domanda dall'elenco delle 'domande senza risposta'.

In WordPress (4.7.5) e WooCommerce (3.0.7), il tuo codice non funziona.

Puoi utilizzare il plug-in di WordPress Filter Featured Products for WooCommerce.

Anche se non aggiornato da molto tempo, funziona ancora perfettamente. Grazie
