Ordenar posts por custom field en el backend – WordPress
Fecha: October 7th, 2010 | Categoria: Wordpress | Tags: backend, custom field, Wordpress | Haz un comentario »
Si estas usando custom fields para personalizar tu sitio en wordpress, quizas en algun momento un cliente te pedirá que desea ordenar los post’s de una manera mas completa a la que wordpress ya lo hace por defecto.
Un linda forma de hacerlo, es agregar la funcionalidad de ordenar posts por custom field o campo personalizado.
Agrega estas lineas de code en el archivo: wp-admin/includes/post.php
y cuentame como te fue : )
if(defined('SHOW_META_VALUES') || defined('META_ALT_QUERY') || defined('SHOW_META_MULTIPLE')) die('Disculpa, algo no esta andando bien.');
// lo q necesitas para filtar por custom field aqui
define('SHOW_META_VALUES',true); // Might possibly slow down load times if viewing lots of posts when active
// opcion de uso alternativo - ymmv, so use whichever works best
define('META_ALT_QUERY',false); // Set to true if you have problems with the standard query, this may help, it may not..
// When filtering by meta key, this sets whether to show all a posts meta values (for that key) or just a single one.
// NOTE: SHOW_META_VALUES must be set to true in order for this to do anything
define('SHOW_META_MULTIPLE',true); // Set to true for multiple or false for single
function add_meta_column_head($defaults) {
$defaults['meta'] = ( isset($_GET['meta_key']) && $_GET['meta_key'] != 'All') ? esc_attr($_GET['meta_key']) : '';
return $defaults;
}
function add_meta_column($column_name,$post_id) {
$metakey = ( isset($_GET['meta_key']) && $_GET['meta_key'] != 'All') ? esc_attr($_GET['meta_key']) : '';
if( $column_name == 'meta' && '' != $metakey )
$val_num = 1;
echo "\n \t";
if( SHOW_META_MULTIPLE ) {
$meta = '
' . $val_num++ . ': '. implode( '
' . "\n \t" .'
' . $val_num++ . ': ', get_post_meta( $post_id , $metakey , false ) ) . '
' . "\n";
}
else {
$meta = '
' . $val_num++ . ': '. get_post_meta( $post_id , $metakey , true ) . '
' . "\n";
}
echo $meta;
return;
}
function wp_admin_filters($query) {
global $pagenow;
if( $query->is_admin && ( 'edit.php' == $pagenow ) ) {
$metakey =
( isset($_GET['meta_key']) && $_GET['meta_key'] != 'All' )
? esc_attr( $_GET['meta_key'] )
: '';
$sortorder =
( isset($_GET['order']) && $_GET['order'] == 'asc' )
? 'asc'
: 'desc';
if( '' != $metakey ) {
if( SHOW_META_VALUES ) {
add_filter( 'manage_posts_columns' , 'add_meta_column_head' );
add_action( 'manage_posts_custom_column' , 'add_meta_column' , 2, 2);
}
$query->set( 'orderby' , 'meta_value' );
$query->set( 'meta_key' , $metakey );
}
if( $sortorder != 'desc' ) {
$query->set( 'order' , 'asc' );
}
else {
$query->set( 'order' , 'desc' );
}
}
return $query;
}
function wp_admin_filters_dropdowns() {
global $wpdb;
$select_meta = '';
if( !META_ALT_QUERY ) {
$meta_keys = $wpdb->get_col("SELECT DISTINCT meta_key FROM $wpdb->postmeta WHERE SUBSTRING(meta_key,1,1) != '_'" );
}
else {
$meta_keys = $wpdb->get_col("SELECT meta_key FROM wp_postmeta WHERE meta_key NOT LIKE '\_%' GROUP BY meta_key" );
}
if( !empty( $meta_keys ) ) {
$metakey = ( isset($_GET['meta_key']) && $_GET['meta_key'] != 'All') ? esc_attr($_GET['meta_key']) : '';
$select_meta .= '
'."\n";
}
echo $select_meta;
$select_order = '
'."\n";
echo $select_order;
return;
}
add_filter('pre_get_posts', 'wp_admin_filters');
add_action('restrict_manage_posts', 'wp_admin_filters_dropdowns',2);
Este code, deberia agregar como esta en la imagen, una columna más para poder ordenar los post por custom field en el backend de wordpress.
En practica:

Como se ve en la imagen, el custom field ‘precio’ ha sido agregado, pudiendo asi ordenar todos los ‘productos’ (posts) por precio de menor a mayor.




Comentarios: