Ordenar posts por custom field en el backend – WordPress

Standard


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>