Ordenar posts por custom field en el backend – WordPress


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.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>