Es muy posible que según el tipo de tienda online que tu, o tus clientes si eres desarrollador, las columnas que aparecen por defecto en el listado del administrador de productos de WooCommerce, no sean las que más necesitas.
En este artículo vamos a ver cómo podemos personalizarlas un poco, quitar las que no necesitamos tener a la vista y añadir alguna, como algún atributo de producto.
(Todas las funciones indicadas a continuación puedes añadirlas al archivo functions.php de tu tema hijo o child theme o en un plugin propio)
Para empezar, si queremos quitar alguna columna del listado de productos que no necesitemos y nos quite espacio, podemos hacerlo con la siguiente función:
Una vez eliminadas las columnas que no necesitamos, vamos a añadir una nueva, en este caso para uno de los atributos de producto que queremos tener a la vista, por ejemplo el proveedor.
Para ello, sustituiremos la función anterior por una que a la vez que oculta algunas columnas, crea las nuevas, y añadiremos otra función para mostrar el contenido deseado en esa nueva columna.
En este caso, hemos creado una nueva columna ‘proveedor’ que muestra el contenido de un atributo de producto creado anteriormente.
De esta forma, podemos personalizar el listado de productos de WooCommerce en el administrador de WordPress, ocultando aquellas columnas que no utilizamos y añadiendo las que necesitamos tener a primera vista.
Es muy útil sobretodo cuando desarrollamos tiendas para clientes y queremos personalizar y facilitar su administración el máximo posible.
Comentarios
48 respuestas a «Modificar columnas del administrador en el listado de productos de WooCommerce»
|
Hola, buen artículo. Tengo una pregunta, ¿ y si quieres añadir aun area de texto en una columna? editable solo para el administrado, para usar como nota de producto.
Un saludo
|
Hola Pablo, muchas gracias!
Ese caso es más complejo, porque ya no se trataría sólo de mostrar información, sino de poder editarla y guardarla… me lo apunto y si encuentro como hacerlo te aviso.
Saludos!
|
GRacias
|
Yo tengo una duda en que archivo haces dicho cambio, estoy tratando de agregar la columna peso porque el envio es en base al peso y mi capturista luego mete la pata y me gustaria que fuera mas rapido ver que metio en esta tabla y asi ajustarlo mas rapido
|
Hola Moises,
Los cambios se han de hacer en el archivo functions.php de tu tema.
Saludos!
|
los códigos tienen algún tipo de error de sintaxis por que cuando los pongo en functions de mi theme se me va el word press a pantallazo Blanco
¿alguna solucion para que funcione el código ?
saludos.
|
Hola Juan,
El código es correcto, pero a veces da problemas al copiar y pegar por el tipo de comillas.
Vuelve a copiar la primera parte a ver si ahora te funciona bien, sino sustituye las comillas manualmente en tu archivo de funciones.
Saludos!
|
Hola! Antes que nada te quiero agradecer mucho por este tutorial, me sirvió muchísimo!! (Si hay alguna forma de agradecer económicamente con el blog, estaré encantado)
Por otro lado, quería consultarte cómo hago en el caso de necesitar añadir 2 columnas de atributos? Porque intenté pegar el código 2 veces pero no me lo acepta.
Muchas gracias desde ya 😉
|
Muchas gracias Javier!
Con tus agradecimientos en el comentario tengo más que suficiente 😉
No he tenido tiempo de probarlo, pero debería funcionarte no duplicando las dos funciones, sino añadiendo dentro el correspondiente atributo, por ejemplo:
// Creamos las funciones para añadir los atributos
function dpw_columns_head_only_products($defaults) {
$defaults['proveedor'] = 'Proveedor'; // Título de la columna
$defaults['referencia'] = 'Referencia'; // Título de la segunda columna
return $defaults;
}
function dpw_columns_content_only_products($column_name, $post_ID) {
if ($column_name == 'proveedor') {
//Buscamos los valores del atributo 'proveedor' y los mostramos.
if($proveedores = get_the_terms( $post_ID, 'pa_proveedor')){
foreach ( $proveedores as $proveedor ) {
echo $proveedor->name;
}
}
if ($column_name == 'referencia') {
//Buscamos los valores del atributo 'referencia' y los mostramos.
if($referencias = get_the_terms( $post_ID, 'pa_referencia')){
foreach ( $referencias as $referencia ) {
echo $referencia->name;
}
}
}
}
A ver si así te funciona y sino buscamos otra solución.
Saludos!
|
Hola: Mi problema es que no aparecen los titulos de productos en el area de administracion de woocommerce. Así que no sale tampoco «Añadir, editar, borrar, vista rapida» que deberia salir debajo del titulo.
He quitado y vuelto a cargar woocommerce y nada. He ido quitando uno a uno los plugins y tampoco.
Puedes ayudarme?
Gracias
|
Hola Concha!
Qué extraño! ¿Te ocurre después de haber utilizado este código o ya te pasaba antes? Si es así, prueba de cambiar de theme, a ver si es problema de la plantilla, y si persiste, desactiva otros plugins que no sean WooCommerce y comprueba si al desactivar alguno de ellos se soluciona, puede ser que sea problema de incompatiblidades.
Saludos!
|
Gracias lo provaré.
|
Hola Esther:
He probado lo que me decías pero sigo en las mismas.
Ni siquiera aparece en la pestaña de opciones de pantalla.
Así que no puedo ver el título del producto que doy de alta.
?Qué puedo hacer?
Gracias
|
Hola Concha,
Si te parece bien te contesto por email y así miramos a ver cual puede ser el problema.
Saludos!
|
El codigo que comentaste no funciono en mi theme, en cambio este si:
add_filter( ‘manage_edit-product_columns’, ‘change_columns_filter’,10, 1 );
function change_columns_filter( $columns ) {
unset($columns[‘product_tag’]);
unset($columns[‘sku’]);
return $columns;
}
Espero le sirva a alquien.
|
Muchas gracias Franco! Lo añadiré al post como alternativa al otro código.
Saludos!
|
Muy util el articulo Esther, me ha servido para limpiar el admin para un cliente y dejarselo facil.
Ahora bien.
Si quisiera hacer lo mismo en el admin de pedidos, es mas, lo ideal sera sustituir por ejemplo la columna de envio por una con el nombre del pedido. (El nombre del pedido es generado mediante un pluging para el Checkout manager). El codigo de este nombre del pedido es «billing_pedido»
De momento me aparece en los mail y dentro del pedido pero es muy tedioso tener que entrar en cada pedido para saber el nombre del pedido.
Postdata. Todo viene porque la tienda que he montado es para un laboratorio fotografico que ytrabaja con profesionales (fotografos) y no hay ninguno que te pregunte por el pedido numero tal, todos hacen lo mismo «el pedido de la Boda de Marta y Elena» «El pedido de la Comunion de alvaro». Vamos unas risa cada vez que les dicen que busquen el numero de pedido.
Muchas gracias por adelantado y felicidades por el blog.
|
Hola Manuel! Gracias a ti!
Pues mira, justamente estos días estoy preparando algo parecido para un cliente, para mostrar un campo personalizado en el listado de pedidos de WooCommerce. En cuanto lo tenga listo lo añado y te aviso por si te sirve.
Saludos!
|
Pues eria estupendo, muchisimas gracias.
Yo ya he conseguida crear la columna y crear un campo personalizado en el Checkout y que apareca en cada pedido pero no consigo mostrarlo en la pagina de administracion de pedidos.
Un saludo.
|
Hola Manuel, te paso el código para mostrar el campo personalizado en el listado:
function sv_wc_dpw_add_new_column_content( $column ) {
global $post;
if ( 'myfield1' === $column ) {
$order = wc_get_order( $post->ID );
$nuevocampo = get_post_meta( $post->ID, 'myfield1', true );
echo $nuevocampo;
}
}
add_action( 'manage_shop_order_posts_custom_column', 'sv_wc_dpw_add_new_column_content' );
Deberás sustituir «myfield1» por el nombre de tu campo personalizado.
En cuanto pueda crearé el post con el código completo.
Saludos!
|
Muchisimas gracias, voy a probar conel tuyo.
Acabo de conseguir crear uno y me ha funcionado pero el tuyo lo veo mucho mas limpio.
Te lo paso a ver que te parece:
// AÑADIR COLUMNA NOMBRE DEL PEDIDO A ADMINISTRACION DE PEDIDOS //
add_filter( ‘manage_edit-shop_order_columns’, ‘custom_shop_order_column’, 20 );
function custom_shop_order_column($columns)
{
$reordered_columns = array();
// Inserting columns to a specific location
foreach( $columns as $key => $column){
$reordered_columns[$key] = $column;
if( $key == ‘order_number’ ){
// Inserting after «Status» column
$reordered_columns[‘my-column1’] = __( ‘Nombre del pedido’,’theme_domain’);
}
}
return $reordered_columns;
}
// AÑADIR DATOS A LA NUEVA COLUMNA
add_action( ‘manage_shop_order_posts_custom_column’ , ‘custom_orders_list_column_content’, 20, 2 );
function custom_orders_list_column_content( $column, $post_id )
{
switch ( $column )
{
case ‘my-column1’ :
// Get custom post meta data
$my_var_one = get_post_meta( $post_id, ‘additional_pedido’, true );
if(!empty($my_var_one))
echo $my_var_one;
// Testing (to be removed) – Empty value case
else
echo ‘(no value)’;
break;
}
}
///
Ahora mismo estoy trabajando para mostrarlo tambien en la pagina de pedidos del cliente
Muchisimas garcias y un saludo enorme
|
Siento ensuciar el post, pero casi lo tenemos 🙂
Si cuando hagas el post explicas tambien como mostrar este campo adicional en la secion de «mis pedidos» quedas invitada a comer :), llevo toda la mañana dandole y casi lo tengo pero me falan conocimientos.
Aqui esta el codigo para mostrar una columna en la secion de mis pedidos (por si te sirve de ayuda), me falta mostrar en el la informacion del custom field
///////////////////////
// AÑADIR COLUMNA NOMBRE DEL PEDIDO A ORDENES DE PEDIDO
//
//
function sv_wc_add_my_account_orders_column( $columns ) {
$new_columns = array();
foreach ( $columns as $key => $name ) {
$new_columns[ $key ] = $name;
// add ship-to after order status column
if ( ‘order-number’ === $key ) {
$new_columns[‘ordername’] = __( ‘Nombre del pedido’, ‘textdomain’ );
}
}
return $new_columns;
}
add_filter( ‘woocommerce_my_account_my_orders_columns’, ‘sv_wc_add_my_account_orders_column’ );
Un saludo y gracias de antemano.
|
Hola Manuel! me encantan los retos… 😉 y las comidas gratis, jeje, así que en cuanto pueda monto el post completo.
Saludos!
|
Perfecto, con ganas de leerlo, a ver si tu codigo queda mas limpio que el mio. Yo ya he podido implementarlo, un dia entero de pelearme y a primera hora esta mañana lo he visto claro y me ha salido bien. Estoy contento :).
Ahora te propongo otro reto, yo ya estoy en ello pero me falta como plantearlo.
Si ves apropiado que creemos otro hilo para debatir dimelo, por si igual se ensucia un poco el blog.
La cuestión es:
No te molesta que cada vez que realizas un pedido en woocommerce, en el Checkout tenga que salir el dichoso formulario para introducir los datos. Si ya los he rellenado porque no simplemente los muestra y si quieres cambiar algo aparezca un «desplegable» o similar. Odio ver cosas en la web que no son necesarias.
Bueno, hay lo dejo, yo estoy trabajando ya en ello. A ver que tal se nos da.
Un saludo.
|
No dices cual es el archivo que se debe modificar
|
Hola Diego,
Pues tienes razón! Como normalmente siempre es el mismo, se me ha olvidado comentarlo, ya lo he añadido.
Las funciones puedes añadirlas al archivo functions.php de tu tema hijo o child theme o en un plugin propio
Saludos!
|
Hola , disculpa yo quería hacer esto también, pero en la opción de pedidos agregando la forma de pago, pero no lo e logrado sera que me puedes ayudar por favor es que no e conseguido la manera, gracias
|
Hola Abraham,
El método para el listado de pedidos es el mismo, teniendo en cuenta que has de utilizar las funciones manage_edit-shop_order_columns y manage_shop_order_posts_custom_column en lugar de las de posts que son las del ejemplo de este artículo, y en tu caso el campo para mostrar la forma de pago es _payment_method_title.
En la Zona DPW estoy preparando un tutorial para ver como modificar este listado y añadir campos existentes o personalizados.
Saludos!
|
Hola muchas gracias por el tuto, lo que yo quiero es agregar en la columna la cantidad de pedidos que hay para cada producto, esto es posible? gracias de nuevo!
|
Me refiero a mostrar la cantidad de pedidos actuales de cada producto mientras estén en el estado «Procesando», gracias de nuevo, espero puedas guiarme para hacer esto posible.
|
Aquí de nuevo! encontré la forma de agregar a la columna el total de veces que se vendió el producto pero no logro que se muestren solo los pedidos que se están procesando, por si a alguien le sirve el código lo dejaré abajo, aún necesito tu ayuda!
/**
* Función para agregar el total de ventas al listado de productos de woocommerce
*/
add_filter( ‘manage_edit-product_columns’, ‘misha_total_sales_1’, 20 );
add_action( ‘manage_posts_custom_column’, ‘misha_total_sales_2’ );
add_filter(‘manage_edit-product_sortable_columns’, ‘misha_total_sales_3’);
add_action( ‘pre_get_posts’, ‘misha_total_sales_4’ );
function misha_total_sales_1( $col_th ) {
return wp_parse_args( array( ‘total_sales’ => ‘Total Sales’ ), $col_th );
}
function misha_total_sales_2( $column_id ) {
if( $column_id == ‘total_sales’ )
echo get_post_meta( get_the_ID(), ‘total_sales’, true );
}
function misha_total_sales_3( $a ){
return wp_parse_args( array( ‘total_sales’ => ‘by_total_sales’ ), $a );
}
function misha_total_sales_4( $query ) {
if( !is_admin() || empty( $_GET[‘orderby’]) || empty( $_GET[‘order’] ) )
return;
if( $_GET[‘orderby’] == ‘by_total_sales’ ) {
$query->set(‘meta_key’, ‘total_sales’ );
$query->set(‘orderby’, ‘meta_value_num’);
$query->set(‘order’, $_GET[‘order’] );
}
return $query;
}
|
Hola Carlos!
Vaya, genial! ni me has dadto tiempo a contestar 😉
Todavía no he podido probarlo, pero tendrías que añadir un filtro a la query para que recoja sólo los que tienen ‘post_status’ como ‘wc-processing’.
En cuanto pueda hago algunas pruebas para confirmarlo.
Un saludo!
|
Gracias por la respuesta rápida! lo que dices tiene algo que ver con esto?
function wc_get_order_statuses() {
$order_statuses = array(
‘wc-pending’ => _x( ‘Pending payment’, ‘Order status’, ‘woocommerce’ ),
‘wc-processing’ => _x( ‘Processing’, ‘Order status’, ‘woocommerce’ ),
‘wc-on-hold’ => _x( ‘On hold’, ‘Order status’, ‘woocommerce’ ),
‘wc-completed’ => _x( ‘Completed’, ‘Order status’, ‘woocommerce’ ),
‘wc-cancelled’ => _x( ‘Cancelled’, ‘Order status’, ‘woocommerce’ ),
‘wc-refunded’ => _x( ‘Refunded’, ‘Order status’, ‘woocommerce’ ),
‘wc-failed’ => _x( ‘Failed’, ‘Order status’, ‘woocommerce’ ),
);
return apply_filters( ‘wc_order_statuses’, $order_statuses );
}
|
Hola Carlos!
No, perdona, lo he estado mirando y el total_sales es un valor que ya está guardado en la base de datos, no lo calcula en ese momento y por tanto no podemos filtrarlo tal cuan según el estado como yo sugería…. se tendría que sustituir el valor por una función personalizada que recorriera los pedidos que se están procesando y contara para cada producto el total…
|
Hola Esther! Qué bueno que hayas escrito este post porque no quería sumar un plugin para esta necesidad tan particular. He intentado simplemente agregar la columna «Categorías» de los productos de WooCommerce copiando las partes que creía correctas del código para mi caso, pero no he logrado que me funcione. ¿Puedes ayudarme?
Desde ya, muchas gracias!
|
Hola Diego!
En principio la categoría de producto ya aparece por defecto en el listado de productos del admin.
Ojo que en el primer código del post la estamos desactivando con «unset($columns[‘product_cat’]); //para las categorías», no incluyas esta línea si quieres que se vea.
Saludos!
|
Oops! Yo estaba introduciendo este código con la intención de ver las categorías en los «Detalles del Pedido»… En vez de poner «unset», cambiaba por «set»… Pero ya veo que había más de un motivo por el que no funcionaba! Muchas gracias por tu respuesta tan rápida!
¿Sabes si es posible lo que busco? Necesito saber si, por ejemplo, me compraron plátanos de categoría «Bío» o «Convencional»
|
Muchas gracias por compartir tu conocimiento, desearía saber si puedes responderme una pregunta. ¿Como sabes que el nombre de la columna proveedor? y ¿donde identificas que su taxonomía es ‘pa_proveedor’?
|
Hola Jhon!
El nombre de la columna se lo das tu al crearla (en la primera función, $columns[‘proveedor’] =….)
Y del tema del taxonomía, por defecto los atributos de WooCommerce llevan el prefijo pa_
Aquí tienes más información: https://docs.woocommerce.com/document/using-custom-attributes-in-menus/
Saludos!
|
Hola Esther
buenos dias
sigo tus posts y uno aprende porque la verdad es que sabes muchisimo.
Muy bueno este, que a pesar que pasa el tiempo, es increible como le sirve a la gente.
Lei en los comentarios que tú has pasado código para mostrar el campo personalizado en el listado.
La pregunta es: podrias compartir un codigo para mostrar el campo personalizado en el listado de productos?
(donde esta el nombre del producto, SKU, precio, categoria, etc)
Me seria enormemente util si me echas una mano.
Gracias por compartir tus conocimientos.
saluditos!
Marcelo
|
Hola Marcelo,
Muchas gracias! Tengo este tutorial en la lista de pendientes… le daré prioridad para intentar sacarlo antes!
Saludos!
|
Hola Esther
dale … estaré atento a ello.
Muchisimas gracias!
Exitos!
Marcelo
|
Hola Marcelo! Ya tienes publicado el nuevo tutorial, espero que te sirva!
Mostrar campos personalizados en el listado de productos de WooCommerce
|
Hola Esther …
ahi me fije … me sirve un monton !
Mil millones de gracias !
Genia!
sds!
Marcelo
|
Hola!
Necesito poder mostrar la visibilidad del producto.
¿me podían ayudar por favor?
Gracias de antemano
|
Hola Marco,
El campo de visibilidad de producto en WooCommerce creo que se llama «product_visibility», puedes adaptar el código del artículo para mostrarla en el listado.
Saludos!
|
Muchas gracias!
|
Hola Esther!
Gracias por los contenidos, tengo un problema y es el siguiente.
He conseguido crear una taxonomia para mostrar «teams» que es como si fueran los proveedores de cada producto . Y esta taxonomia se muestra en la pagina de productos. Necesito que esa misma columna se muestre en la pagina de pedidos, para saber cada pedido de qué proveedor es. He probado el codigo que decías arriba pero no me ha funcionado, este es el codigo completo que utilizo
function register_teams_taxonomy() {
$labels = array(
‘name’ => __( ‘Teams’, ‘taxonomy general name’ ),
‘singular_name’ => __( ‘Team’, ‘taxonomy singular name’ ),
‘search_items’ => __( ‘Search Teams’ ),
‘all_items’ => __( ‘All Teams’ ),
‘parent_item’ => __( ‘Parent Team’ ),
‘parent_item_colon’ => __( ‘Parent Team:’ ),
‘edit_item’ => __( ‘Edit Team’ ),
‘update_item’ => __( ‘Update Team’ ),
‘add_new_item’ => __( ‘Add New Team’ ),
‘new_item_name’ => __( ‘New Team Name’ ),
‘menu_name’ => __( ‘Teams’ ),
);
$args = array(
‘public’ => true,
‘hierarchical’ => true,
‘labels’ => $labels,
‘show_ui’ => true,
‘query_var’ => true,
‘rewrite’ => array(
‘slug’ => ‘teams’,
‘with_front’ => true,
),
‘show_admin_column’ => true
);
register_taxonomy(«product_team», array(«product»), $args );
}
add_action( ‘init’, ‘register_teams_taxonomy’ );
/**
* Filter team products from main shop only on frontend on shop, category, and tag archives
*/
function exclude_team_products( $query ) {
$archive_query = $query->is_post_type_archive(‘product’) && $query->is_main_query();
$cat_tag_query = $query->is_tax( array(‘product_cat’, ‘product_tag’) ) && $query->is_main_query();
if ( !is_admin() && $archive_query || !is_admin() && $cat_tag_query ) {
$taxquery = array(
array(
‘taxonomy’ => ‘product_team’,
‘field’ => ‘id’,
‘terms’ => », //leave blank to filter all teams
‘operator’=> ‘NOT EXISTS’
)
);
$query->set( ‘tax_query’, $taxquery );
}
}
add_action(‘pre_get_posts’, ‘exclude_team_products’ );
function sv_wc_dpw_add_new_column_content( $column ) {
global $post;
if ( ‘product_team’ === $column ) {
$order = wc_get_order( $post->ID );
$nuevocampo = get_post_meta( $post->ID, ‘product_team’, true );
echo $nuevocampo;
}
}
add_action( ‘manage_shop_order_posts_custom_column’, ‘sv_wc_dpw_add_new_column_content’ );
A ver si puedes ayduarme. Muchas gracias!