Hacks

Cambiar el orden (orderby) en los listados por defecto de WordPress

Podemos cambiar el orden de un listado de una categoría (o cualquier otra taxonomía) muy fácilmente. Así por ejemplo podemos ordenar los posts por orden ascendente o descendente, por cualquier valor que permite WP_Query:

'none' - No order (available with Version 2.8).
'ID' - Order by post id. Note the captialization.
'author' - Order by author.
'title' - Order by title.
'date' - Order by date.
'modified' - Order by last modified date.
'parent' - Order by post/page parent id.
'rand' - Random order.
'comment_count' - Order by number of comments (available with Version 2.9).
'menu_order' - Order by Page Order.
'meta_value' - Note that a 'meta_key=keyname' must also be present in the query.
'meta_value_num' - Order by numeric meta value (available with Version 2.8). Also note that a 'meta_key=keyname' must also be present in the query. This value allows for numerical sorting as noted above in 'meta_value'.

Para ello, tan sólo tienes que añadir un filtro a pre_get_posts en tu functions.php. Este filtro te permite redfinir la query, de manera que puedes setear por ejemplo, el valor del ordeby.

En mi ejemplo cambio del orden de mostrar los posts en cualquier archive por el número de comentarios:

// Runs before the posts are fetched
add_filter( 'pre_get_posts' , 'my_change_order' );
// Function accepting current query
function my_change_order( $query ) {
	// Check if the query is for an archive
	if($query->is_archive) {
		//$query->set( 'order' , 'asc' );
		$query->set( 'orderby' , 'comment_count' );
	}
		// Query was for archive, then set order

	// Return the query (else there's no more query, oops!)
	return $query;
}

Ahora siempre que entres al listado de una categoría, o cualquier otra taxonomía los posts ya no estarán ordenados por fecha, sino que por el número de comentarios.

Redireccionar a la página actual al hacer login en WordPress

WordPress redirecciona por defecto a wp-admin al hacer login, en este post os voy a pasar unos sencillos códigos para forzar a WordPress a hacer la redirección a la página actual tras hacer login. Este código ha sido probado en WordPress 3 Multisitio + Buddypress.

Es muy simple, tan solo hay que enviar la variable redirect_to con el valor de la URL actual site_url( $_SERVER['REQUEST_URI'], ya sea por POST o por GET.

De este modo quedaría:

Link para ir a wp-login y volver a la página alctual. Se usa la función wp_login_url a la cual se le pasa como parámetro la URL actual.

<a href="<?php echo wp_login_url(site_url( $_SERVER['REQUEST_URI'] )); ?>" title="Login">Iniciar sesión</a>

También se podría añadir directamente en el formulario de login, de modo que se enviaría por POST, tan solo añadir en el formulario la siguiente línea:

<input type="hidden" name="redirect_to" value="<?php echo site_url( $_SERVER['REQUEST_URI'] ) ?/>" />

Un ejemplo de formulario de login extraido de wprecipes al que le hemos añadido la redirección:

<<?php if (!(current_user_can('level_0'))){ ?>
<h2>Login</h2>
<form action="<?php echo get_option('home'); ?>/wp-login.php" method="post">
<input type="text" name="log" id="log" value="<?php echo wp_specialchars(stripslashes($user_login), 1) ?>" size="20" />
<input type="password" name="pwd" id="pwd" size="20" />
<input type="submit" name="submit" value="Send" class="button" />
    <p>
       <label for="rememberme"><input name="rememberme" id="rememberme" type="checkbox" checked="checked" value="forever" /> Remember me</label>
       <input type="hidden" name="redirect_to" value="<?php echo $_SERVER['REQUEST_URI']; ?>" />
    </p>
</form>
<a href="<?php echo get_option('home'); ?>/wp-login.php?action=lostpassword">Recover password</a>
<?php } else { ?>
<h2>Logout</h2>
<a href="<?php echo wp_logout_url(urlencode($_SERVER['REQUEST_URI'])); ?>">logout</a><br />
<a href="http://XXX/wp-admin/">admin</a>
<?php }?>