WooCommerce - filtrar por productos destacados en el área de administración
WooCommerce tiene una forma sencilla de seleccionar productos "Destacados" haciendo clic en un pequeño icono de estrella en la columna "Destacado" en el área de administración.
Necesito poder filtrar y mostrar solo los productos destacados en el área de administración. ¿Alguien conoce una forma directa de hacer esto?
Investigué un poco y resulta que esto se hace con meta claves/valores, donde _featured
es la clave y el valor es yes
o no
.
Desafortunadamente, como no se hace con taxonomías como las categorías de productos, no hay forma de usar la funcionalidad de filtro en el área de administración para mostrar solo productos destacados. Puedes ordenar la columna destacados para que estén todos en la parte superior o inferior de la lista de productos, pero eso es todo.
Puedes ordenar tu lista de productos por el estado de destacados. Solo haz clic en la estrella en la parte superior de la columna... una vez colocará todos los elementos no destacados arriba, y dos veces debería invertir esto y poner todos los elementos destacados arriba.
La URL de tu administrador se verá así:
/wp-admin/edit.php?post_type=product&orderby=featured&order=desc
EDITADO:
Bien, resultó que no fue tan difícil filtrar por estado de destacado. WooCommerce filtra por "subtipo", y dado que también filtra por metadatos, podemos copiar en gran parte su código y hacer algunos ajustes.
La primera función agrega el elemento select/desplegable, mientras que la segunda maneja los ajustes a la consulta del administrador.
/**
* Filtrar productos por tipo
*
* @access public
* @return void
*/
function wpa104537_filter_products_by_featured_status() {
global $typenow, $wp_query;
if ($typenow=='product') :
// Destacado/No Destacado
$output .= "<select name='featured_status' id='dropdown_featured_status'>";
$output .= '<option value="">'.__( 'Mostrar todos los estados de destacado', 'woocommerce' ).'</option>';
$output .="<option value='featured' ";
if ( isset( $_GET['featured_status'] ) ) $output .= selected('featured', $_GET['featured_status'], false);
$output .=">".__( 'Destacado', 'woocommerce' )."</option>";
$output .="<option value='normal' ";
if ( isset( $_GET['featured_status'] ) ) $output .= selected('normal', $_GET['featured_status'], false);
$output .=">".__( 'No Destacado', 'woocommerce' )."</option>";
$output .="</select>";
echo $output;
endif;
}
add_action('restrict_manage_posts', 'wpa104537_filter_products_by_featured_status');
/**
* Filtrar los productos en el administrador según las opciones
*
* @access public
* @param mixed $query
* @return void
*/
function wpa104537_featured_products_admin_filter_query( $query ) {
global $typenow, $wp_query;
if ( $typenow == 'product' ) {
// Subtipos
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' );
Actualizado para WooCommerce 3.0
La devolución de llamada parse_query
debe actualizarse ya que el estado de destacado ya no se almacena como metadatos de publicación.
/**
* Filtrar los productos en el administrador según las opciones
*
* @access public
* @param mixed $query
* @return void
*/
function wpa104537_featured_products_admin_filter_query( $query ) {
global $typenow;
if ( $typenow == 'product' ) {
// Subtipos
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' );

Gracias. Como mencioné en la última oración de mi pregunta, soy consciente de esa función de ordenación. Sin embargo, quiero usar la función Ordenar Productos, que permite el ordenamiento arrastrando y soltando, para ordenar Productos Destacados, lo cual no es posible por defecto.
Puedes filtrar por categoría, luego hacer clic en "Ordenar Productos" y arrastrarlos al orden que desees. Quiero esto para productos destacados...

Justo hoy estaba leyendo un artículo sobre cómo la gente no lee los artículos completos en la web, parece que me atrapaste. Mira mi edición.

Parece que estaba encontrando mi solución mientras publicabas la tuya, y se ven similares. ¡Gracias!

Sí, parece que estamos haciendo lo mismo. Un pequeño ajuste interesante... podría usarlo en mis propios sitios.

Bueno, tiene 4 años y WooCommerce sufrió una gran renovación con su lanzamiento 3.0. Lo he actualizado y parece funcionar.

¡Muchas gracias! Parte del código nuevo está afuera. Te sugiero que lo revises.

@helgatheviking ¡Eres increíble! Gracias por esto; funciona perfectamente en WP 4.8.3 y WC 3.1.2

Encontré este plugin: https://wordpress.stackexchange.com/a/45447/15190, que pude personalizar para proporcionar una lista de selección para filtrar por Productos destacados. Con eso, puedo usar la función de arrastrar y soltar Ordenar productos de WooCommerce para cambiar fácilmente el orden en que aparecen los Productos destacados en el widget de Productos destacados y otros lugares.
Aquí está el código con mis personalizaciones que lo harán funcionar para los Productos destacados de WooCommerce:
<?php
/*
Plugin Name: Filtro de administración por Productos Destacados de WooCommerce
Plugin URI: http://en.bainternet.info
Description: adaptado de https://wordpress.stackexchange.com/q/45436/2487. Permite mostrar solo Productos destacados, lo que luego permite ordenar los Productos destacados arrastrando y soltando
Version: 1.0
Author: Bainternet
Author URI: http://en.bainternet.info
*/
add_action( 'restrict_manage_posts', 'wpse45436_admin_posts_filter_restrict_manage_posts' );
/**
* Primero crea el menú desplegable
*
* @author Ohad Raz
*
* @return void
*/
function wpse45436_admin_posts_filter_restrict_manage_posts(){
$type = 'post';
if (isset($_GET['post_type'])) {
$type = $_GET['post_type'];
}
//solo agregar filtro al tipo de publicación que deseas
if ('product' == $type){
//cambia esto a la lista de valores que deseas mostrar
//en formato 'etiqueta' => 'valor'
$values = array(
'Mostrar solo Destacados' => 'Yes',
'Mostrar solo No Destacados' => 'No',
);
?>
<select name="Featured">
<option value=""><?php _e('Mostrar Destacados y No Destacados', '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' );
/**
* si se envía, filtrar por metadatos de publicación
*
* @author Ohad Raz
* @param (objeto wp_query) $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'];
}
}

No olvides seleccionar una de nuestras respuestas como la respuesta oficial para sacar esto de la pila de 'preguntas sin responder'.

Puedes utilizar el plugin de WordPress Filter Featured Products for WooCommerce.

Aunque no se ha actualizado en mucho tiempo, todavía funciona perfectamente. Gracias
