Wordpress por y para primates
Hacks
Cambiar el orden (orderby) en los listados por defecto de WordPress
27 feb
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.
Cómo no registrar actividad en Buddypress al crear un post
10 may
En algunos proyectos de Buddypress en los que estás haciendo una inserción automática de posts puede ser que no quieras que Buddypress registre en su actividad que has creado un nuevo post, ya sea porque tú mismo quieres registrar la actividad de una manera direferente, ya sea porque simplemente no quieres mostrarlo. Pues bien, el sencillo código que has de añadir a tu función, antes de insertar el post es
remove_action( 'save_post', 'bp_blogs_record_post', 10, 2 );
al igual que esto, podéis quitar otros registros de actividad, por ejemplo, cuando alguien agrega un comentario:
remove_action( 'comment_post', 'bp_blogs_record_comment', 10, 2 );
O cuando se crea un nuevo blog:
remove_action( 'wpmu_new_blog', 'bp_blogs_record_blog', 10, 2 );
Stylesheet solo para Chrome con php.
5 abr
Uno de esos trucos rápidos para salir de un apuro como fue mi caso esta mañana. Después de maquetar una web y tenerla finalizada con todo validado y testeado en Firefox e Internet Explorer, me doy cuenta de un detalle, que en Chrome algunos estilos no los estaba cogiendo bien.
Echando en falta una sentencia como el mítico comentario [if IE] recordé aquella global $_SERVER['HTTP_USER_AGENT'] que nos permite hacer una sentencia para diferenciar entre navegadores. Como tenía que aplicar esos cambios en un WordPress, lo hice de la siguiente manera:
<?php
function is_chrome(){return(eregi("chrome", $_SERVER['HTTP_USER_AGENT']));}if(is_chrome()){
echo ""?>
<link rel="stylesheet" type="text/css" media="all" href="<?php bloginfo( 'template_directory' ); ?>/chrome.css" />
<?"";
}
?>
Que básicamente carga chrome.css desde la carpeta del theme que estemos usando solo cuando estemos en Chrome. En esa hoja sobreescribimos los estilos a corregir o bien forzando con !important.
No es nada nuevo, ni mucho menos, pero quería postearlo para compartirlo y tenerlo más a mano.
Redireccionar a la página actual al hacer login en WordPress
28 mar
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 }?>
Cómo cambiar el link a WordPress del wp-login
15 feb

wp-login
Os mostramos un filtro muy sencillo pero tremendamente útil para dar entregar la Web a un cliente. Simplemente quita el link a WordPress.com en el login por la URL que quieras. Copiad y pegad este filtro en vuestro functions.php.
function login_link () {
return 'http://elembarazo.net';
}
add_filter('login_headerurl', 'login_link', 100);
Cómo listar post por estados (futuros, privados, pendientes, etc.)
10 ene
Hay veces que nos vendría muy bien ya sea para uso personal o administrativo como para mostrar a los usuarios cuales son los próximos post que están programados, y darles asi un motivo más para volver “más tarde”. La funcion query_posts() entre mil otros parametros cuenta con el parametro post_status que nos permite ordenar/listar post por, como su nombre indica, estados. Desde Codex podemos saber que tenemos los siguientes filtros:
- 'post_status' => 'publish' – devuelve estado de publicación del post. Los valores posibles son:
- publish - Un post o página publicada
- pending - post pendiente de revisión
- draft - post en estado de borrador
- auto-draft – post en estado de borrador automático
- future - post programado para el futuro
- private - post marcados como privado. Solo pueden visualizarlos usuarios autorizados
- inherit
- trash - post de la papelera.
Aquí un ejemplo de uso:
<?php query_posts('showposts=10&post_status=future'); ?>
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<h2><?php the_title(); ?></h2>
<span class="datetime"><?php the_time('j. F Y'); ?></span></p>
<?php endwhile;
else: ?><p>No future events scheduled.</p>
<?php endif; ?>
Cómo comentaba antes, el uso puede ser muy variado y siempre dependerá de tu necesidad o imaginación, pero no cabe duda que es un filtro muy útil para multitud de situaciones.