Tags para los Custom Post Types

nube de tags

Ya existe mucha documentación sobre cómo crear taxonomías y cómo usarlas en los custom post types, pero… ¿cómo usar las taxonomías que usa WordPress por defecto? A esta pregunta no existe mucha documentación, y menos en español. Por esto, he decidido volver a escribir en TodoWP y hacer un pequeño manual de cómo usar específicamente tags en un tipo de post personalizado.

Los ingredientes para lograrlo son:

  1. La definición o declaración del post type
  2. La conexión del tipo de post con la taxonomía
  3. El cambio en el query por defecto

Lo primero es tener el custom post type:

register_post_type('alojamiento',
array(
'labels' => array(
'name' => 'Alojamientos',
'singular_name' => 'Alojamiento'
),
'capability_type' => 'post',
'public' => true,
'supports' => array('title','editor'),
'taxonomies' => array('post_tag')
)
);

Este es un ejemplo básico de cómo se registra un post type, lo importante en este ejemplo es la linea donde se registran las posibles taxonomías para este tipo.

'taxonomies' => array('post_tag')

Nota: en esta parte no es necesario poner todas las taxonomías que se usarían. Luego se pueden crear taxonomías personalizadas para usarlas con este tipo de post.

tags

Hasta el momento aun no ponemos usarla, ¿por qué? Porque el editor no nos mostrará la caja que permite agregar las etiquetas. Para esto nuestro segundo ingrediente.


register_taxonomy_for_object_type('post_tag', 'alojamiento');

Esta última linea se coloca también en la acción init, al igual que el register_post_type. Hasta el momento todo funciona perfecto, podemos crear custom post y asignarles etiquetas. Incluso si agregamos un widget con la nube de etiquetas aparecerán las que hayamos creado y nos indicará cuántos posts tienen esa etiqueta.

Pero aún hay un problema: si en esa nube de etiquetas entramos a ver el listado de posts no veremos los de tipo especial, incluso aparecerán los posts normales, pero no los especiales.

Para esto nuestro tercer ingrediente. El problema radica en que el query que internamente tiene WordPress en el momento de solicitar los contenidos que se pasan a la plantilla para ser mostrados no incluye los post types.


function agregar_los_custom_posts($query)
{
if(is_tag() && empty($query->query_vars['suppress_filters']))
{
$post_types = array('post', 'alojamiento');
$query->set('post_type', $post_types);
return $query;
}
}
add_filter( 'pre_get_posts', 'agregar_los_custom_posts' );

Este filtro logra agregar nuestro o nuestros tipos al query en caso necesario.

Espero que esto les ayude cuando estén en sus desarrollos. Comenten sus resultados.

Hotfix, parcheando WordPress con estilo

A ninguno se nos escapa que WordPress es un CMS que se actualiza a cada necesidad o vulnerabilidad descubierta. Mediante las actualizaciones de seguridad – a pesar de que a algunos les moleste andar actualizando cada dos por tres – mantenemos WordPress seguro y al día.

Pero hay veces en que algunos fallos tardan en acometerse por parte del equipo de desarrollo, y es aquí donde entra Hotfix.

Este plugin es una especie de parcheador de fallos, que mantiene tu WordPress seguro y al día hasta que salga la próxima versión estable de WordPress o actualización que solucione el fallo en cuestión.

Su uso es sencillo: lo instalas, lo activas y funciona solo, aplicando los parches necesarios para mantener tu WordPress a tono.

Si lo instalas ahora, y dependiendo de tu versión de WordPress instalada, lo que soluciona es lo siguiente:

  • WordPress 3.3
    • Evita que los estilos de plugins y temas se infiltren en el Escritorio
    • Soluciona un fallo para servidores sin soporte preinstalado de JSON
  • WordPress 3.2
    • Incluye soporte de JSON para configuraciones PHP extrañas
  • WordPress 3.1.3
    • Soluciona un fallo que hace que post_status funcione mal si se pasa un array
  • WordPress 3.1
    • Soluciona un fallo que provoca algunas manipulaciones en queries de taxonomías  (como al excluir categorías), y que hace que no funcionen como deberían.
  • WordPress 3.0.5
    • Evita que KSES muestre imágenes recortadas y fallos HTML en los comentarios del Administrador/Editor.

Creo que no hace falta decir que si no estás seguro de necesitarlo mejor no lo instales.

Taxonomías avanzadas en WordPress 3.1

Esta es otra entrega del repaso que estoy haciendo en mi blog de las novedades más interesantes que nos aporta WordPress 3.1. Este último artículo ha llegado con un poco de retraso, pero bueno, aquí está, esta vez publicado en Ayuda WordPress.

Vamos a ver una novedad muy interesante que nos ofrece WordPress 3.1: la posibilidad de seleccionar a la vez múltiples taxonomías. Imaginémonos que tenemos varias taxonomías, por ejemplo (suponiendo que las entradas hacen referencia a videojuegos): Plataforma, Desarrollador, Género, Edad Recomendada, etc... Hasta ahora si queríamos obtener los resultados que pertenecieran a una taxonomía concreta no teníamos problemas. Pero si queríamos mostrar los resultados que pertenecieran a dos taxonomías a la vez (por ejemplo aquellos videojuegos cuya plataforma es Playstation 3 y su edad recomendada 18 años) no podíamos hacerlo. Hasta ahora.

Pero empecemos desde el principio. Vamos a ver primero qué es una taxonomía y dónde estábamos antes de WordPress 3.1

Qué es una Taxonomía

Sabéis que WordPress tiene Categorías y Etiquetas. Pues bien, estas son en sí mismas taxonomías, es decir, criterios para clasificar una entrada, artículo, noticia o como queráis llamarlo. Lo interesante es que además de las Categorías y de las Etiquetas WordPress te permite crear taxonomías adicionales con el fin de lograr una mejor clasificación de tus entradas.

Por ejemplo, si queremos clasificar un grupo de videojuegos podemos hacerlo de muchas maneras: según su plataforma (PC, Playstation 3, XBox 360, etc..), según la edad recomendada, el tipo de juego, el precio, etc... Es más que probable que sólo con las Categorías y las Etiquetas te quedes corto y necesites crear nuevas taxonomías.

Cómo crear una taxonomía

Vamos con un ejemplo real. Vamos a suponer que tenemos este videojuego para una web figurada que se llama "misvideojuegos.com":

  • Título de la Entrada: Postal 2
  • Categoría: Inteligencia
  • Etiquetas: Ciencia ficción, 3D
  • Idioma: Castellano
  • Plataforma: XBox 360
  • Fabricante: Valve
  • Edad: 12 años

Lo que vamos a lograr es que se pueda adjuntar toda esta información al videojuego que vayas a crear en WordPress. Para lograrlo necesitarás crear (o "registrar" como lo llaman en WordPress) las nuevas taxonomías. Para ello abre el archivo functions.php de tu tema y escribe:

function crear_mis_taxonomias() {
  register_taxonomy('idioma', 'post', array(
  'hierarchical' => false, 'label' => 'Idioma',
  'query_var' => true, 'rewrite' => true));

  register_taxonomy('plataforma', 'post', array(
  'hierarchical' => false, 'label' => 'Plataforma',
  'query_var' => true, 'rewrite' => true));

  register_taxonomy('fabricante', 'post', array(
  'hierarchical' => false, 'label' => 'Fabricante',
  'query_var' => true, 'rewrite' => true));

  register_taxonomy('edad', 'post', array(
  'hierarchical' => false, 'label' => 'Edad',
  'query_var' => true, 'rewrite' => true))
}
add_action('init', 'crear_mis_taxonomias', 0);

Grabamos el archivo y entramos en el administrador de WordPress. Si hacemos click en añadir una nueva Entrada, veremos que en la derecha, debajo de etiquetas, tenemos las nuevas taxonomías:

Taxonomías en WordPress

Para crear o "registrar" una taxonomía utilizamos la función de WordPress register_taxonomy(). En este enlace podéis ver la gran cantidad de parámetros que podemos usar al crear nuestras taxonomías.

En el código podemos ver que el segundo parámetro es el que indica a qué objeto aplicamos las nuevas taxonomías. En el ejemplo hemos puesto "post", lo cual indica que se añadirán a cualquier Entrada que creemos. ¿Y si queremos que aparezcan en las Páginas pero no en las Entradas? Entonces pondríamos 'page'. ¿Y si hemos creado unas Entradas Personalizadas que se llaman "videojuegos"? (si queréis ver cómo crear entradas personalizadas podéis verlo en el artículo Nuevo en WordPress 3.1: Archivos de Entradas Personalizadas. Entonces escribiríamos 'videojuegos' y las taxonomías saldrían sólo en las entradas personalizadas que se llaman 'videojuegos'. ¿Y si queremos que salgan en varios sitios? Entonces en vez de una cadena ponemos un array:

register_taxonomy('edad', array('videojuegos', 'post'), array(
  'hierarchical' => false, 'label' => 'Edad',
  'query_var' => true, 'rewrite' => true));

Si hemos añadido las taxonomías a una entrada personalizada estas aparezerán en el menú de la izquierda bajo la misma:

Taxonomías en entradas personalizadas

¿Qué URLs obtenemos?
Ahora obtendremos nuevas URLs en línea con las nuevas taxonomías. Por ejemplo:

http://www.misvideojuegos.com/edad/12-anos/
http://www.misvideojuegos.com/idioma/castellano/
http://www.misvideojuegos.com/plataforma/playstation-3/

http://www.misvideojuegos.com/fabricante/valve/

Estas URLs utilizarán el fichero archive.php de nuestro tema para mostrar todas las entradas que cumplan con la taxonomía correspondiente. Pero ¿cómo las mostramos?

Mostrar las entradas correspondientes a una etiqueta de una taxonomía concreta

Para mostrar las entradas que tengan una etiqueta concreta de una de nuestras taxonomías tenemos que poner este código antes del "loop" de nuestro tema:

<?php query_posts(array('plataforma' => 'playstation-3', 'showposts' => 15)); ?>

Se mostrarán entonces todas las entradas que pertenezcan a la etiqueta "Playstation 3" de la Taxonomía "Plataforma". Le hemos indicado también que muestre 15 entradas.

Nota: Cuando decimos antes del loop es antes de:

<?php while ( have_posts() ) : the_post(); ?>

Mostrar todos los valores de una taxonomía

Si queremos mostrar todas las entradas, una a una, que correspondan a una taxonomía concreta simplemente pon este código:

<?php echo get_the_term_list($post->ID, 'plataforma', 'Plataforma: ', ', ', ''); ?>

Los tres últimos parámetros le dicen a WordPress qué es lo que tiene que poner antes de los enlaces de las etiquetas, entre cada enlace y después de cada enlace respectivamente.

Mostrar una nube de taxonomías en tu tema de WordPress

Para mostrar una nube de taxonomías que contenga todas las etiquetas de una taxonomía concreta, añade este código donde quieras que aparezca:

<?php wp_tag_cloud(array('taxonomy' => 'plataforma', 'number' => 30)); ?>

Recuerda cambiar "plataforma" por el nombre de tu taxonomía. También puedes editar el parámetro "number" que especifica cuantas etiquetas se van a mostrar. Para mostrarlas todas pon "0".

Consultas avanzadas de Taxonomías en WordPress 3.1

Bueno, por fin estamos donde queríamos llegar: a las novedades que nos ofrece WordPress 3.1 para las Taxonomías. Las consultas avanzadas de Taxonomías usan un nuevo parámetro en las funciones de consulta que se llama “tax_query”

tax_query es un array de arrays, donde cada array describe qué criterio quieres que se cumpla a la hora de mostrar las entradas. No hay mucha documentación aún sobre tax_query, por lo que seguro que saldrán más y mejores usos de los que pongo yo aquí.

Supongamos que en nuestro blog tenemos una Categoría que se llama "Libros" y una etiqueta que se llama "Misterio" (recordad que las Categorías y las Etiquetas son Taxonomías). Si queremos mostrar todas las entradas que tengan la categoría "Libros" y la etiqueta "Misterio", pondríamos antes del "loop":

$custom_query = wp_parse_args($query_string);
$custom_query['tax_query'] = array(
    array(
     'taxonomy' => 'category',
     'terms' => array('Libros'),
     'field' => 'slug',
   ),
  array(
  'taxonomy' => 'post_tag',
    'terms' => array('Misterio'),
    'field' => 'slug',
   ),
);
query_posts($custom_query);
query_posts($custom_query);

Como veis las entradas que se van a mostrar satisfacen los dos criterios a la vez. Se puede incluir un array de Categorías y un array de Etiquetas. Más opciones:

Si lo que queremos es que NO salgan las entradas que tengan una o varias categorías concretas (por ejemplo, que no salgan las entradas con las categorías "Libros" ni "Discos"):

$custom_query = wp_parse_args($query_string);
$custom_query['tax_query'] = array(
array(
'taxonomy' => 'category',
'terms' => array('libros', 'discos'),
'field' => 'slug',
'operator' => 'NOT IN',
),
);
query_posts($custom_query);

Igualmente, esto hay que ponerlo antes del loop, para que en el loop sólo salgan las entradas que hemos seleccionado previamente. Como veis, a diferencia del anterior ahora hay un nuevo parámetro llamado "operator" que tiene como valor "NOT IN".

Por último, podemos seleccionar que salgan las entradas que son de una Categoría (por ejemplo "Libros") o de una etiqueta concreta (por ejemplo "Heavy"). Como veréis a continuación, la diferencia radica en el parámetro "relation".

$custom_query = wp_parse_args($query_string);
$custom_query['tax_query'] = array(
'relation' => 'OR',
array(
'taxonomy' => 'category',
'terms' => array('libros'),
'field' => 'slug',
),
array(
'taxonomy' => 'post_tag',
'terms' => array('heavy'),
'field' => 'slug',
),
);
query_posts($custom_query);

Os habréis fijado que en estos ejemplos hay un campo que se llama "field" para el que hemos dado el valor "slug". Si en vez del "slug" queremos dar el ID de la Categoría o Etiqueta, tendriamos que poner “term_id”. También se puede poner su nombre con "name" en vez de "slug". Por defecto es "term_id".

Eso en cuanto a Categorías y Etiquetas, pero ¿y si quiero hacerlo con las taxonomías que he creado? Pues por ejemplo, si quiero que salgan sólo aquellos videojuegos que estén recomendados para una edad superior a los 18 años, pondría antes del loop:

$myquery['tax_query'] = array(
    array(
        'taxonomy' => 'edad',
        'terms' => array('19'),
        'field' => 'slug',
    ),
);
query_posts($myquery);

Saldrían aquellos artículos en los que en el cuadro de la nueva taxonomía "Edad" haya incluido el número 18. Podría hacer igualmente combinaciones y exclusiones tal y como hicimos con las Categorías y las Etiquetas.

Pero siguiendo con el ejemplo que teníamos más arriba, en el que teníamos una entrada personalizada llamada "Videojuegos" con varias taxonomías, si suponemos que sólo queremos mostrar las entradas personalizadas "videojuegos" cuya taxonomía "Edad" sea 18 años, ponemos antes del loop:

<?php
$query = array(
tax_query => array(
array(
taxonomy => 'edad',
terms => array('18'),
field => 'slug'
)
),
'post_type' => 'videojuegos'
);
query_posts($query);
?>

Como veis hemos añadido "post-type" para poner el nombre de la entrada personalizada.

Y por último, sabed que incluso podemos combira meta_query con tax_query, como en este ejemplo:

$query = array(
'post_type' => 'ad',
'meta_query' => array(
array(
'key' => 'status',
'value' => 'Active',
'compare' => 'LIKE'
)
),
'tax_query' => array(
array(
'taxonomy' => 'size',
'terms' => array( 'box' ),
'field' => 'slug'
)
)
);

Y esto es todo, ¡espero que os sea de utilidad!

WordPress 3.1.1

Si ya actualizaste a WordPress 3.1 ahora es momento de que lo hagas a WordPress 3.1.1, una actualización de seguridad (y más) imprescindible:

  • Mejora la seguridad en la carga de imágenes
  • Mejoras de rendimiento
  • Mejora el soporte de  IIS6
  • Soluciona los enlaces de taxonomías y PATHINFO (/index.php/)
  • Soluciona varios casos extremos en que queries y taxonomías podrían provocar problemas de compatibilidad con plugins

Ya sabes, actualiza.

Novedades de WordPress 3.1

Si ya te estás mordiendo las uñas por saber que nos traerá WordPress 3.1, y no quieres esperar a que nos lo cuente Zé Fontainhas en WordCamp, aquí tienes las más importantes novedades de esta versión que, si no cambia la programación, estará disponible  en su versión definitiva para finales de este año o principios de 2.011.

  • Formatos de entradas: la maravilla de WordPress 3.1.
  • Búsqueda de temas mejorada (#14936)
  • Enlaces internos: para mejorar el SEO de tus entradas enlazando a otras publicaciones de tu sitio desde el editor.
  • Barra de admin, la incorporación de la barra de WordPress.com a tu WordPress multisitio (#14772)
  • Mejoras en las pantallas de administración mediante AJAX, pudiendo filtrar entradas y ordenarlas mucho mejor
  • Actualización del editor Tiny MCE (#12574)
  • Búsquedas Multi-taxonomía, algo largo tiempo demandado para no tener que hacer apaños
  • Página de índice de tipos de entradas personalizadas (#13818)
  • Mejoras en el CSS del escritorio, sobre todo en el esquema de color azul (#14770)
  • Escritorio personalizado de usuario en Multisitio, evitando la mezcla actual de escritorios de SuperAdmin y usuario (#14696)
  • Administrador de la Red, para reforzar lo anterior (#14435)
  • Mejorar el reinicio de contraseña, de manera que no sea como ahora, que hacen falta dos emails. La idea es que el mismo sistema te ofrezca en la misma pantalla ya la contraseña o incluso que puedas elegirla tu mismo, con un solo email (#5919)

Novedades de WordPress 3.1

La nueva versión, WordPress 3.1, que se espera lanzar a mediados de Diciembre (de este año) tendrá unas cuantas novedades, no grandes cambios como la redefinición de "perfiles y capacidades" de usuarios, pero si algunos avances interesantes.

Lo que nos avanza Jane Wells es lo siguiente:

  • Enlaces internos, de manera que podamos buscar y añadir enlaces internos usando la misma interfaz del editor, una gran noticia para mejorar el SEO interno de nuestros sitios.
  • Barra de administración, similar a la de WordPress.com, una maravilla para las webs multisitio o acceder fácilmente al escritorio.
  • Mejoras AJAX en la interfaz de administración, permitiendo más personalización y paginaciones más flexibles.
  • Escritorio separado de la red, distinto de los escritorios de cada sitio en webs multisitiio.
  • Plantillas y estilos de entradas, de manera más simple que las actuales plantillas de entrada y taxonomía.
  • Publicación rápida en la web, fuera del escritorio, al estilo de otros CMS, mediante quicktags se podrá integrar el widget de publicación rápida (QuickPress) en el lugar que se desee de la web.
  • Limpieza de la interfaz de administración, lo que supondría un buen repaso al código existente y, posiblemente, una reducción del peso del escritorio.
  • Queries avanzadas de taxonomías, lo que podría ser un adelanto del ansiado nuevo buscador interno de WordPress, que no termina de llegar. Con esto no tendríamos la limitación de búsqueda por una sola tag, aunque ya sabes que hay trucos para buscar en varias categorías y tags.

En fin, que es solo un avance, seguro que de aquí a Diciembre vemos más posibles mejoras. Personalmente me gusta todo lo propuesto, aún dejando en la recámara aún mejoras interesantes (a mi modo de ver) como …

  • Sistema interno propio de cache
  • Nuevo buscador avanzado de WordPress
  • Personalización de perfiles y capacidades
  • Reducción de carga de la base de datos
  • Tiny MCE Advanced por defecto
  • Editor de temas y plugins mejorado
  • Sistema de SEO interno

Más plugins para plantillas de entradas

Una de las novedades de WordPress 3.0 que más está gustando, por lo que facilita el uso de WordPress como CMS, es la incorporación de plantillas de entradas y taxonomías, y si ya vimos uno de los plugins que facilita sobremanera el modo de crear estas plantillas, cada vez van saliendo más, aquí tienes otros que han ido saliendo:

  • Post Templates – ¿Tienes muchas entradas y quieres aplicarles una plantilla distinta, personalizada?. Pues estás de suerte porque con este plugin puedes cambiar la plantilla de entrada para entradas concretas o toda una categoría. Especialmente útil en sitios en los que quieras cambiar la plantilla de entradas de una manera rápida y sencilla.
  • Simple Post Template – Este plugin te permite personalizar las plantillas de entrada fácilmente.
  • Custom Post Template – También permite crear plantillas de entrada, con la peculiaridad de que ofrece una interfaz de "arrastrar y soltar" para facilitar la creación de las mismas.
  • Single Post Template – Otro plugin que ofrece una interfaz "arrastrable" con plantillas que puedes pre-configurar. Si quieres muchos tipos de entradas personalizadas te facilita la vida.
  • Serial Posts – Este plugin es un pelín más complicado de configurar pero una vez pasado el primer trago luego es todo mucho más sencillo a la hora de crear plantillas personalizadas para las entradas.

Nota: si yaaaaaa, la foto no tiene nada que ver pero es que me ha parecido desternillante

Custom post types para humanos

Una de las posibilidades más interesantes a la hora de usar WordPress como CMS son los tipos de entradas personalizadas, o custom post types, una de las novedades de WordPress 3.0.

En realidad no es difícil crear este tipo de entradas personalizadas y definir parámetros para las mismas pero ¿que te parecería disponer de una interfaz de administración sencilla para crearlos a golpe de clic?, genial ¿verdad?, pues ya puedes hacerlo.

Custom Post Type UI es un plugin que ofrece exactamente eso, la creación de tipos de entradas personalizadas sin necesidad de tocar ni una línea de código en el fichero functions.php. Lo instalas, lo activas y creas y configuras tus tipos de entradas personalizadas, así de sencillo, solo necesitas WordPress 3.0.

Pero no solo eso, sino que también te permite conseguir a golpe de clic otra de las novedades importantes de WordPress 3.0, las taxonomías personalizadas, igual de fácil que con las entradas personalizadas.

En este vídeo se explica como hacerlo, a pesar de que no tiene complicación alguna … 


Contenido exclusivo para suscriptores al Feed

¡Gracias por seguirnos a diario!. Premiamos tu fidelidad ofreciéndote habitualmente contenidos exclusivos. Hoy puedes descargar:

Clic aquí para iniciar la descarga Guía Windows Live Writer

¿Te gustó este post? ¡Compártelo! Bitacoras.com TwitThis Facebook Meneame Google Bookmarks del.icio.us Live Technorati Ping.fm Wikio Turn this article into a PDF! E-mail this story to a friend! Print this article!

35 Funciones útiles para functions.php en WordPress

Normalmente cualquier tema de Wordpress que utilicemos, ya sea externo o creado por nosotros, tiene un archivo functions.php donde se agrupan las funciones que va a utilizar nuestro tema. Su utilidad puede ser de lo más variada, desde cambiar comportamientos por defecto de Wordpress a funciones útiles típicas de cualquier aplicación en PHP.

Seguramente cualquier diseñador que utilice Wordpress con frecuencia tiene una serie de funciones que utiliza en todos sus diseños. Yo suelo utilizar un tema vacío (Starkers) que me permite empezar todo de cero, dándome mayor maniobrabilidad. Pero incluyo ciertas variaciones propias, entre ellas mis propios archivos functions.php y style.css.

Estuve pensando en un principio en incluir en este artículo mi archivo functions.php, en el que incluyo una serie de funciones de uso frecuente. Pero luego decidí ampliar el artículo incluyendo funciones sugeridas por distintos autores, para lograr una cobertura mucho más amplia de funciones útiles. Empezamos.

Cargar jQuery

Mediante esta función nos aseguramos de que se incluye una copia de jQuery. Se obtiene desde los servidores de Google para ahorrarnos algo de ancho de banda y para conseguir en teoría más rapidez para el usuario. Si tenemos alguna función relacionada con jQuery debería ir debajo de esta.

PHP:
  1. if ( !is_admin() ) {
  2.        wp_deregister_script('jquery');
  3.        wp_register_script('jquery', ("http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"), false);
  4.        wp_enqueue_script('jquery');
  5.     }

Crear Widgets

Esta función seguro que es de sobra conocida y viene además en la práctica totalidad de temas, incluso en starkers. Se puede adaptar en función del nombre del widget, y de lo que queramos que aparezca antes y después del widget.

PHP:
  1. if (function_exists('register_sidebar')) {
  2.         register_sidebar(array(
  3.             'name' => 'Sidebar Widgets',
  4.             'id'   => 'sidebar-widgets',
  5.             'description'   => 'These are widgets for the sidebar.',
  6.             'before_widget' => '<div id="%1$s" class="widget %2$s">',
  7.             'after_widget'  => '</div>',
  8.             'before_title'  => '<h2>',
  9.             'after_title'   => '</h2>'
  10.         ));
  11.     }

Taxonomías

El uso de esta función lo he explicado en este artículo sobre cómo crear Taxonomías en mi blog.

PHP:
  1. function taxonomias_propias() {
  2.         register_taxonomy('artista', 'post', array(
  3.                     'hierarchical' => false, 'label' => 'Artista',
  4.                     'query_var' => true, 'rewrite' => true));
  5.         register_taxonomy('album', 'post', array(
  6.                     'hierarchical' => false, 'label' => 'Album',
  7.                     'query_var' => true, 'rewrite' => true));
  8.         register_taxonomy('genero', 'post', array(
  9.                     'hierarchical' => false, 'label' => 'Género',
  10.                     'query_var' => true, 'rewrite' => true));
  11.         register_taxonomy('autor', 'post', array(
  12.                     'hierarchical' => false, 'label' => 'Autor',
  13.                     'query_var' => true, 'rewrite' => true));
  14.         register_taxonomy('duracion', 'post', array(
  15.                     'hierarchical' => false, 'label' => 'Duración',
  16.                     'query_var' => true, 'rewrite' => true));
  17.         register_taxonomy('fecha', 'post', array(
  18.                     'hierarchical' => false, 'label' => 'Fecha',
  19.                     'query_var' => true, 'rewrite' => true));
  20.     }
  21.     add_action('init', 'taxonomias_propias', 0);

Crear Taxonomías en páginas

La anterior función creaba taxonomías en las entradas de nuestro blog. Veremos cómo crearlas en las páginas.
Fuente: http://justintadlock.com/archives/2009/11/09/excerpts-and-taxonomies-for-pages-in-wordpress-2-9
Hay que recordar que en Wordpress 2.9 las Taxonomías no admiten jerarquización, como las categorías. Como ejemplo, creamos una Taxonomía para páginas llamada "people":

PHP:
  1. register_taxonomy( 'people', 'page', array( 'hierarchical' => false, 'label' => 'People', 'query_var' => true, 'rewrite' => true ) );
  2.  
  3. add_action( 'admin_menu', 'my_page_taxonomy_meta_boxes' );
  4.  
  5. function my_page_taxonomy_meta_boxes() {
  6.     foreach ( get_object_taxonomies( 'page' ) as $tax_name ) {
  7.         if ( !is_taxonomy_hierarchical( $tax_name ) ) {
  8.             $tax = get_taxonomy( $tax_name );
  9.             add_meta_box( "tagsdiv-{$tax_name}", $tax->label, 'post_tags_meta_box', 'page', 'side', 'core' );
  10.         }
  11.     }
  12. }

Crear Campos Personalizados Globales

Esta función la he descubierto no hace mucho. Fuente: http://digwp.com/2009/09/global-custom-fields-take-two/. Como sabemos, los campos personalizados normales (Custom Fields) en Wordpress están asignados a cada entrada o a cada página. Es decir, que un dato que se repita por toda la web habría que estar incorporándolo en cada entrada, en cada página, etc.. Gracias a la función que veremos a continuación podemos crear Campos Personalizados Globales, disponibles en todas las páginas y entradas. Su ubicación es un poco extraña, ya que una vez creados aparecen en el menú de opciones dentro del administrador.

PHP:
  1. <?php
  2. add_action('admin_menu', 'add_gcf_interface');
  3.  
  4. function add_gcf_interface() {
  5.     add_options_page('Global Custom Fields', 'Global Custom Fields', '8', 'functions', 'editglobalcustomfields');
  6. }
  7.  
  8. function editglobalcustomfields() {
  9.     ?>
  10.     <div class='wrap'>
  11.     <h2>Global Custom Fields</h2>
  12.     <form method="post" action="options.php">
  13.     <?php wp_nonce_field('update-options') ?>
  14.  
  15.     <p><strong>My Name:</strong><br />
  16.     <input type="text" name="myname" size="45" value="<?php echo get_option('myname'); ?>" /></p>
  17.  
  18.     <p><strong>Amazon ID:</strong><br />
  19.     <input type="text" name="amazonid" size="45" value="<?php echo get_option('amazonid'); ?>" /></p>
  20.  
  21.     <p><strong>Today's Featured Website:</strong><br />
  22.     <input type="text" name="todaysite" size="45" value="<?php echo get_option('todaysite'); ?>" /></p>
  23.     <p><strong>Welcome Text:</strong><br />
  24.     <textarea name="welcomemessage" cols="100%" rows="7"><?php echo get_option('welcomemessage'); ?></textarea></p>
  25.     <p><input type="submit" name="Submit" value="Update Options" /></p>
  26.     <input type="hidden" name="action" value="update" />
  27.     <input type="hidden" name="page_options" value="myname,amazonid,todaysite,welcomemessage" />
  28.     </form>
  29.     </div>
  30.     <?php } ?>

Para usarlo simplemente hay que escribir echo get_option('welcomemessage'); o echo get_option('todaysite'); etc (relacionados con el ejemplo de la función)

Campos personalizados (Custom Fields)

Fuente: http://www.mattvarone.com/wordpress/useful-functions-for-wordpress/
Esta función permite simplificar el uso de los Campos Personalizados (Custom Fields) que se pueden incorporar en cada entrada o página. Su uso es:
get_custom_field_value( Custom Field Key, Print ); donde:
1. Custom Field Key: ( cadena ) – Nombre del Campo Personalizado que quieres obtener
2. Print: ( booleano, falso por defecto ) – escribe o devuelve el valor.
Ejemplo:

PHP:
  1. <ul>
  2. // gets the value of the custom field featured_image and prints it.
  3. if ( function_exists( 'get_custom_field_value' ) ) get_custom_field_value( 'featured_image', true );
  4. </ul>
  5. </pre>
  6. Y ahora la función:
  7. <pre lang="php" line="1">
  8. function get_custom_field_value( $szKey, $bPrint = false)
  9. {
  10.     global $post;
  11.     $szValue = get_post_meta( $post->ID, $szKey, true );
  12.     if ( $bPrint == false ) return $szValue; else echo $szValue;
  13. }

Permitir comentarios anidados (threaded comments)

Para activar los comentarios anidados hay que añadir un código dentro del head de tu tema justo antes de wp_head. Este código se puede incorporar a functions.php, lo que ayuda a limpiar un poco la zona del head. Precisa que la función que incorpora jQuery esté ubicada por encima de esta dentro de functions.php
Fuente: http://digwp.com/2010/03/wordpress-functions-php-template-custom-functions/

PHP:
  1. function enable_threaded_comments(){
  2.     if (!is_admin()) {
  3.         if (is_singular() AND comments_open() AND (get_option('thread_comments') == 1))
  4.             wp_enqueue_script('comment-reply');
  5.         }
  6. }
  7. add_action('get_header', 'enable_threaded_comments');

Eliminar basura del área head

Según algunos autores, Wordpress ubica gran cantidad de código no muy útil en el head. Cosas como el número de versión, y enlaces WLW, RSD...
Para limpiar todo esto basta con esta función.
Fuente: http://digwp.com/2010/03/wordpress-functions-php-template-custom-functions/

PHP:
  1. remove_action('wp_head', 'rsd_link');
  2. remove_action('wp_head', 'wp_generator');
  3. remove_action('wp_head', 'feed_links', 2);
  4. remove_action('wp_head', 'index_rel_link');
  5. remove_action('wp_head', 'wlwmanifest_link');
  6. remove_action('wp_head', 'feed_links_extra', 3);
  7. remove_action('wp_head', 'start_post_rel_link', 10, 0);
  8. remove_action('wp_head', 'parent_post_rel_link', 10, 0);
  9. remove_action('wp_head', 'adjacent_posts_rel_link', 10, 0);

Añadir Google Analytics al footer

Esta función nos permite añadir de una manera sencilla Google Analytics.
Sólo requiere cambiar UA-XXXXX-X por tu código (el que te provee Google Analytics). Esta función utiliza el sistema ga.js, pero se puede cambiar a cualquiera de los otros que ofrece Analytics.
Fuente: http://digwp.com/2010/03/wordpress-functions-php-template-custom-functions/

PHP:
  1. function add_google_analytics() {
  2.     echo '<script src="http://www.google-analytics.com/ga.js" type="text/javascript"></script>';
  3.     echo '<script type="text/javascript">';
  4.     echo 'var pageTracker = _gat._getTracker("UA-XXXXX-X");';
  5.     echo 'pageTracker._trackPageview();';
  6.     echo '</script>';
  7. }
  8. add_action('wp_footer', 'add_google_analytics');

Ajustar el tamaño del extracto

Como sabemos, podemos mostrar el contenido completo de un artículo o su extracto. El extracto tiene un límite de 55 palabras. Esta función te permitirá especificar cualquier longitud (cambia el número 20 a la cifra que quieras).
Fuente: http://digwp.com/2010/03/wordpress-functions-php-template-custom-functions/

PHP:
  1. function custom_excerpt_length($length) {
  2.     return 20;
  3. }
  4. add_filter('excerpt_length', 'custom_excerpt_length');

Reducir el tamaño del texto

Función para reducir el número de caracteres de una entrada.
Fuente: http://www.mattvarone.com/wordpress/functionsphp-wordpress-themes/
Ejemplo de uso:
1. Caracteres: ( número int, por defecto 250 ) – Número de caracteres que se muestran.
2. Cola: ( cadena, por defecto "…" ) – Texto a mostrar tras el texto cortado.
3. Mostrar: ( booleano, por defecto: true ) – Imprime la lista o lo devuelve para PHP.

PHP:
  1. // wordpress loop
  2. while (have_posts()) : the_post();
  3.       <h1>the_title(); </h1>
  4.       <div class="entry">
  5. // se cortará el texto al llegar a los 150 caracteres
  6. if ( function_exists( 'shorten_text' ) ) shorten_text( 150 );
  7. </div>
  8. endwhile;

La función que va en functions.php es:

PHP:
  1. function shorten_text( $iChars = 250, $szTail = "...", $bPrint = true )
  2. {
  3. global $post;
  4. $szText = strip_tags( trim( $post->post_content ) );
  5. $szText = substr( $szText, 0, $iChars );
  6. $szText = substr( $szText, 0, strrpos( $szText , ' ' ) ) . $szTail;
  7. apply_filters('the_excerpt', $szText);
  8. if ( $bPrint == true ) echo $szText; else return $szText;
  9. }

Limitar el número de palabras

Ejemplo de uso

PHP:
  1. $longtext= get_the_excerpt(); // Uso con el extracto, aunque se puede hacer con el contenido completo.
  2. $permalink = get_permalink($post->ID);
  3. $shorttext=limit_words($longtext, 13,'&#91;...&#93;&nbsp;&nbsp;<a href="'. $permalink . '" class="mas" title="Ir al art&iacute;culo">M&aacute;s&raquo;</a>' );
  4. echo '<p>' . $shorttext . '</p>';

La función que va en functions.php es:

PHP:
  1. function limit_words( $str, $num, $append_str='' ) {
  2.     $words = preg_split( '/[\s]+/', $str, -1, PREG_SPLIT_OFFSET_CAPTURE );
  3.     if( isset($words[$num][1]) ){
  4.         $str = substr( $str, 0, $words[$num][1] ) . $append_str;
  5.     }
  6.     unset( $words, $num );
  7.     return trim( $str );
  8. }

Cadena de puntos suspensivos personalizadas para el Extracto en Wordpress 2.9+

En los extractos, estos acaban por defecto en "[...]". Esto lo podemos cambiar a lo que queramos con la función que veremos a continuación. Símplemente reemplaza los puntos suspensivos por la cadena de texto que prefieras.
Fuente: http://digwp.com/2010/03/wordpress-functions-php-template-custom-functions/.

PHP:
  1. function custom_excerpt_more($more) {
  2.     return '...';
  3. }
  4. add_filter('excerpt_more', 'custom_excerpt_more');

Añadir un favicon a tu blog

Con esta función podrás emplazar de manera muy simple un favicon para tu web. Símplemente sube el icono al directorio raíz (el directorio lo puedes cambiar en la función), escribe la función en functions.php y se añadirá automáticamente la línea necesaria en el head de tu página siempre y cuando tengas wp_head en tu fichero head.php de tu tema.
Fuente: http://digwp.com/2010/03/wordpress-functions-php-template-custom-functions/

PHP:
  1. function blog_favicon() {
  2.     echo '<link rel="Shortcut Icon" type="image/x-icon" href="'.get_bloginfo('wpurl').'/favicon.ico" />';
  3. }
  4. add_action('wp_head', 'blog_favicon');

Añadir un favicon a tu área de administración

Igual que el anterior, pero en vez de para la web, esta vez es para tu área de administración. Crea un icono y súbelo al directorio /images/ (puedes cambiar el directorio si quieres)
Fuente: http://digwp.com/2010/03/wordpress-functions-php-template-custom-functions/

PHP:
  1. function admin_favicon() {
  2.     echo '<link rel="Shortcut Icon" type="image/x-icon" href="'.get_bloginfo('stylesheet_directory').'/images/favicon.png" />';
  3. }
  4. add_action('admin_head', 'admin_favicon');

Logo personalizado en el login de admin

Fuente: http://www.chrisdecker.com/wordpress/customize-your-wordpress-admin-panel-login-logo/
Puedes cambiar el logo de Wordpress que sale en el login de la página de administración de tu web por otro de tu elección con esta función. Símplemente crea una imagen no mayor de 328 x 84 y súbela al directorio /images/ de tu servidor con el nombre que pongas en la función (en este caso "customlogofilename.png". Si no lo tuvieras créalo. El código a incluir en functions.php es:

PHP:
  1. function my_custom_login_logo() {
  2.     echo '<style type="text/css">
  3.         h1 a { background-image:url(/images/customlogofilename.png) !important; }
  4.     </style>';
  5. }
  6.  
  7. add_action('login_head', 'my_custom_login_logo');

Eliminar el mensaje de actualización de Wordpress

Permite eliminar el a veces molesto mensaje que aparece en el panel de administración que nos pide que actualicemos nuestra versión de Wordpress.
Fuente: http://digwp.com/2010/03/wordpress-functions-php-template-custom-functions/

PHP:
  1. if (!current_user_can('edit_users')) {
  2.     add_action('init', create_function('$a', "remove_action('init', 'wp_version_check');"), 2);
  3.     add_filter('pre_option_update_core', create_function('$a', "return null;"));
  4. }

Eliminar el mensaje de error en la pantalla de login de admin

Cuando ponemos mal la contraseña un mensaje nos dice que lo que está mal es la contraseña, lo cual no es muy seguro al dar pistas de cual es el error. Con este código en functions.php eliminamos ese problema.

PHP:
  1. add_filter('login_errors',create_function('$a', "return null;"));

Forzar wp-admin a usar SSL

Util para los que tengan un certificado SSL, ya sea propio o compartido. Es más seguro acceder a el área de administración a través de SSL.

PHP:
  1. define('FORCE_SSL_ADMIN', true);

ID de la Categoría en Body y en la clase de la entrada (post)

Por defecto, WordPress no incluye el ID de la categoría de la entrada actual en body_class ni en post_class. Esta función permite añadirlo.
Fuente: http://digwp.com/2010/03/wordpress-functions-php-template-custom-functions/

PHP:
  1. function category_id_class($classes) {
  2.     global $post;
  3.     foreach((get_the_category($post->ID)) as $category)
  4.         $classes [] = 'cat-' . $category->cat_ID . '-id';
  5.         return $classes;
  6. }
  7. add_filter('post_class', 'category_id_class');
  8. add_filter('body_class', 'category_id_class');

Obtener el ID de la primera categoría

Otra función útil cuando tenemos diferentes categorías. Permite obtener el ID de la primera categoría de la entrada actual.
Para usarlo símplemente usa get_first_category_ID(); en el archivo template de tu tema.
Fuente: http://digwp.com/2010/03/wordpress-functions-php-template-custom-functions/

PHP:
  1. function get_first_category_ID() {
  2.     $category = get_the_category();
  3.     return $category[0]->cat_ID;
  4. }

Obtener los comentarios más recientes

Con esta función obtenemos los comentarios más recientes.
Para usarlo escribimos dp_recent_comments(6); en el template de nuestro tema, donde el número entre paréntesis es el número de comentarios que queremos que aparezcan.
Fuente: http://www.wplancer.com/how-to-display-recent-comments-without-using-a-plugin-or-widget/

PHP:
  1. function dp_recent_comments($no_comments = 10, $comment_len = 35) {
  2.     global $wpdb;
  3.     $request = "SELECT * FROM $wpdb->comments";
  4.     $request .= " JOIN $wpdb->posts ON ID = comment_post_ID";
  5.     $request .= " WHERE comment_approved = '1' AND post_status = 'publish' AND post_password =''";
  6.     $request .= " ORDER BY comment_date DESC LIMIT $no_comments";
  7.     $comments = $wpdb->get_results($request);
  8.     if ($comments) {
  9.             foreach ($comments as $comment) {
  10.                 ob_start();
  11.         ?>
  12.         <li>
  13.                     <a href="<?php echo get_permalink( $comment->comment_post_ID ) . '#comment-' . $comment->comment_ID; ?>"><?php echo dp_get_author($comment); ?>:</a>
  14.                     <?php echo strip_tags(substr(apply_filters('get_comment_text', $comment->comment_content), 0, $comment_len)); ?>
  15.         </li>
  16.         <?php
  17.         ob_end_flush();
  18.             }
  19.     } else {
  20.             echo '<li>'.__('No comments', 'banago').'';
  21.     }
  22. }
  23. function dp_get_author($comment) {
  24.     $author = "";
  25.     if ( empty($comment->comment_author) )
  26.         $author = __('Anonymous', 'banago');
  27.     else
  28.         $author = $comment->comment_author;
  29.     return $author;
  30. }

Como vemos en:

PHP:
  1. function dp_recent_comments($no_comments = 10, $comment_len = 35)

tenemos por defecto 10 comentarios con una longitud de 35 caracteres, que podemos cambiar.

Crear un código corto (shortcode) para el enlace de portada

Esta función convierte el shortcode [home] a un enlace a tu página de inicio. Para usarlo símplemente escribe [home] en cualquier entrada de tu blog y Wordpress ejecutará la función myHomePage y mostrará el enlace a la home. Puedes probarla para crear otros enlaces. Tienes que cambiar domain.tld por la URL de tu Home, etc..

PHP:
  1. function myHomePage() {
  2. return '<a href="http://domain.tld/"
  3. title="My Website Homepage">My Homepage</a>';
  4. }
  5. add_shortcode('home', 'myHomePage');

Eliminar la versión de Wordpress del header y del feed

PHP:
  1. add_filter('the_generator','killVersion');
  2. function killVersion() { return ''; }
  3. remove_action('wp_head', 'wp_generator');

Limpiar pigbacks y trackbacks de los comentarios

PHP:
  1. function cleanPings($comment, $args, $depth) {
  2. $GLOBALS['comment'] = $comment;
  3. echo '<li>'.comment_author_link().'</li>';
  4. }

Para usarlo, normalmente en comments.php:

PHP:
  1. wp_list_comments('type=pings&callback=cleanPings');

Contar el número de comentarios (sin trackbacks ni pingbacks)

Filtramos la función comments_number de Wordpress para obtener sólo el número de comentarios, ya que normalmente esta función incluye también pingbacks y trackbacks.
Para usarlo símplemente pon comments_number() donde quieras mostrar el número.

PHP:
  1. function countComments($count) {
  2. global $wp_query;
  3. return count($wp_query->comments_by_type['comment']);
  4. }
  5. add_filter('get_comments_number', 'countComments', 0);

Activar miniaturas (thumnails), en Wordpress 2.9+

Podéis ver cómo funciona en este artículo de mi blog: http://www.emenia.es/nuevo-en-wordpress-2-9-miniaturas-de-entrada-post-thumbnails/.

Para usarlo símplemente hay que poner the_post_thumbnail(); dentro del loop.

PHP:
  1. if (function_exists('add_theme_support')) { add_theme_support('post-thumbnails'); }

Obtener y mostrar la primera imagen de una entrada

Con esta función obtenemos la primera imagen que se encuentre dentro del contenido de una entrada.
Fuente: http://www.mattvarone.com/wordpress/useful-functions-for-wordpress/
Los parámetros son:
1. Número de Imagen: Número de la imagen que deseas obtener (por defecto 0, que es por el número que empieza).
2. Mostrar: ( booleano, por defecto false ) – Muestra o devuelve el valor para php.
Uso de la función:

PHP:
  1. <ul>
  2. if ( function_exists( 'get_post_image' ) ) get_post_image( 0, true );
  3. </ul>

Y la función, que irá en functions.php, es:

PHP:
  1. function get_post_image( $iImageNumber = 0, $bPrint = false )
  2. {
  3.     global $post;
  4.     $szPostContent = $post->post_content;
  5.     $szSearchPattern = '~<img [^\>]*\ />~';
  6.     preg_match( $szSearchPattern, $szPostContent, $pics );
  7.     if ( $bPrint == true && !empty($pics) ) echo $pics[$iImageNumber]; else return $pics[$iImageNumber];
  8. }

Obtener los artículos más recientes

Fuente: http://www.mattvarone.com/wordpress/functionsphp-wordpress-themes/
Parámetros:
1. Cantidad: (por defecto 5 ) – Número de entradas para mostrar.
2. Categorías: (por defecto todas las categorías ) – Categorías a incluír o excluir.
3. HTML anterior: ( por defecto li ) – HTML antes del enlace al artículo.
4. HTML después: (por defecto /li ) – HTML después del enlace.
Ejemplo de uso:

PHP:
  1. <ul>
  2. // obtiene las 10 últimas entradas de todas las categorías excepto de la categoría 5
  3. if ( function_exists( 'wp_list_recent_posts' ) ) wp_list_recent_posts( 10, '-5' );
  4. </ul>
  5. </pre>
  6. La función que va en functions.php es:
  7. <pre lang="php" line="1">
  8. function wp_list_recent_posts( $iAmount = 5, $szCat = null, $szBefore = "<li>", $szAfter = "</li>" )
  9. {
  10.     ( $szCat != null ) ? $szCat = "&cat=" . $szCat : $szCat ;
  11.     $aRecentPosts = new WP_Query( "showposts=" . $iAmount . $szCat );
  12.     while($aRecentPosts->have_posts()) : $aRecentPosts->the_post();
  13.     $szReturn .= $szBefore . '<a href="' . get_permalink() . '">' . get_the_title() . '</a>' . $szAfter;
  14.     endwhile;
  15.     echo $szReturn;
  16. }

Obtener los artículos más populares basado en el número de comentarios

Fuente: http://www.gilbertpellegrom.co.uk/top-wordpress-functions-for-your-functions-php-file/
Se puede cambiar el número de artículos cambiando LIMIT al final de $popularposts (en el ejemplo a continuación mostrará los 6 primeros).

PHP:
  1. function get_popular_posts() {
  2.     global $wpdb;
  3.     $now = gmdate("Y-m-d H:i:s",time());
  4.     $lastmonth = gmdate("Y-m-d H:i:s",gmmktime(date("H"), date("i"), date("s"), date("m")-12,date("d"),date("Y")));
  5.     $popularposts = "SELECT ID, post_title, COUNT($wpdb->comments.comment_post_ID) AS 'stammy' FROM $wpdb->posts, $wpdb->comments WHERE comment_approved = '1' AND $wpdb->posts.ID=$wpdb->comments.comment_post_ID AND post_status = 'publish' AND post_date <'$now' AND post_date> '$lastmonth' AND comment_status = 'open' GROUP BY $wpdb->comments.comment_post_ID ORDER BY stammy DESC LIMIT 6";
  6.     $posts = $wpdb->get_results($popularposts);
  7.     $popular = '';
  8.     if($posts){
  9.         foreach($posts as $post){
  10.             $post_title = stripslashes($post->post_title);
  11.             $guid = get_permalink($post->ID);
  12.             $popular .= '<li><a href="'.$guid.'" title="'.$post_title.'">'.$post_title.'</a></li>';
  13.             $i++;
  14.         }
  15.     }
  16.     echo $popular;
  17. }

Mostrar el Copyright

Esta función muestra una información de copyright dinámica, es decir, se irá actualizando cada año.
Fuente: http://www.mattvarone.com/wordpress/useful-functions-for-wordpress/
Parámetros:
1. Año: ( por defecto el año actual ) – Si se da un año previo al actual se mostrará así: 2006 – 2008.
2. Separador: ( por defecto: " – " ) – Texto utilizado para separar los años (en el caso de que se haya declarado un año previo al actual).
3. Cola: ( por defecto ". Todos los derechos reservados." ) – Texto a mostrar tras la información del copyright.

Uso de la función:

PHP:
  1. if ( function_exists( 'display_copyright' ) ) display_copyright();
  2. // Mostrará: <div id="copyright">&amp;copy; 2008. Blog Name. Todos los derechos reservados.</div>
  3. if ( function_exists( 'display_copyright' ) ) display_copyright( 2006, ' a ', '. Some rights reserved.' );
  4. // Mostrará: <div id="copyright">&amp;copy; 2006 a 2008. Blog Name. Some rights reserved.</div>

La función que va en functions.php es:

PHP:
  1. function display_copyright( $iYear = null, $szSeparator = " - ", $szTail = '. Todos los derechos reservados.' )
  2. {
  3.     echo '<div id="copyright">' . display_years( $iYear, $szSeparator, false ) . ' &copy; ' . get_bloginfo('name') . $szTail . '</div>';
  4. }
  5.  
  6. function display_years( $iYear = null, $szSeparator = " - ", $bPrint = true )
  7. {
  8.     $iCurrentYear = ( date( "Y" ) );
  9.     if ( is_int( $iYear ) )
  10.     {
  11.         $iYear = ( $iCurrentYear> $iYear ) ? $iYear = $iYear . $szSeparator . $iCurrentYear : $iYear;
  12.     } else {
  13.         $iYear = $iCurrentYear;
  14.     }
  15.     if ( $bPrint == true ) echo $iYear; else return $iYear;
  16. }

Botón para abrir los PDF en Google Docs

Uso:

PHP:
  1. [pdf href="http://yoursite.com/linktoyour/file.pdf"]View PDF[/pdf]
  2. Fuente: <a href="http://www.wpfunc.com/wordpress/create-pdf-button.html" title="Ir al artículo">http://www.wpfunc.com/wordpress/create-pdf-button.html</a>

Función en functions.php:

PHP:
  1. function pdflink($attr, $content) {
  2.     return '<a class="pdf" href="http://docs.google.com/viewer?url=' . $attr['href'] . '">'.$content.'</a>';
  3. }
  4. add_shortcode('pdf', 'pdflink');

Añade un ID al ul que se encuentra dentro de un menu desplegable

Si hemos creado un menú desplegable del tipo wp_list_pages('exclude=116,122&title_li='); veremos que se crea un menú en el que el ul principal tiene la clase topnav. Si queremos que el ul anidado tenga otra clase (por ejemplo subnav) escribiríamos esta función:

PHP:
  1. function add_menuclass($ulclass) {
  2. return preg_replace('/<ul>/', '<ul class="subnav">', $ulclass, 1);
  3. }
  4. add_filter('wp_list_pages','add_menuclass');

Cambiar el avatar por defecto

Primero creamos un nuevo avatar de 100x100 pixels. Luego lo subimos a /wp-content/themes/tu-tema/images/, grabándolo como gravatar.jpg.

Ahora añadimos este código a nuestro functions.php:

PHP:
  1. if ( !function_exists('fb_addgravatar') ) {
  2.     function fb_addgravatar( $avatar_defaults ) {
  3.     $myavatar = get_bloginfo('template_directory').'/images/gravatar.jpg';
  4.     //avatar por defecto
  5.     $avatar_defaults[$myavatar] = 'Nuevo gravatar';
  6.     return $avatar_defaults;
  7.     }
  8.  add_filter( 'avatar_defaults', 'fb_addgravatar' );
  9. }

Añade los scripts de Contact Form 7 sólo en las páginas seleccionadas

Suelo utilizar Contact Form 7, pero lo malo es que sus scripts se añaden en todas las páginas, esté presente el formulario o no. Con esta función se evita ese problema. Por ejemplo, si sólo lo quiero en la página con ID=33:

PHP:
  1. function add_wpcf7_scripts() {
  2.     if ( is_page('33') )
  3.         wpcf7_enqueue_scripts();
  4. }
  5. if ( ! is_admin() && WPCF7_LOAD_JS )
  6.     remove_action( 'init', 'wpcf7_enqueue_scripts' );
  7. add_action( 'wp', 'add_wpcf7_scripts' );

¿Te gustó este post? ¡Compártelo! Bitacoras.com TwitThis Facebook Meneame Google Bookmarks del.icio.us Live Technorati Ping.fm Wikio Turn this article into a PDF! E-mail this story to a friend! Print this article!

Usando shortcodes en todas partes

hack wordpress

Ya hemos visto muchas maneras de personalizar WordPress con shortcodes pero estas pequeñas maravillas pueden usarse en muchos más sitios que en el editor de entradas, aquí tienes unos cuantos buenos ejemplos … 

Shorcodes en widgets de texto

Lo primero es añadir este código al fichero functions.php de tu tema activo:

PHP:
  1. add_filter( 'widget_text', 'shortcode_unautop');
  2. add_filter( 'widget_text', 'do_shortcode');

La segunda línea es la que hace que funcionen los shortcodes en el widget de texto. Además, hay que tener en cuenta que los widgets de texto tienen una casilla para "añadir saltos de párrafo automáticamente", pues bien, la segunda linea inhabilita el código autop que podría, en caso de estar marcada la casilla, meter el shortcode introducido en un párrafo o incluso romper las tags.

Shortcodes en el tema

También se pueden usar shortcodes en el tema que uses. Para ello utilizamos la función do_shortcode() en la que el argumento será una cadena que contendrá el shortcode.

Por ejemplo, para mostrar el shortcode [publicidad] en tu tema pondrías algo así donde quieras que aparezca el resultado esperado:

PHP:
  1. <?php do_shortcode('[publicidad]'); ?>

La función do_shortcode() acepta cualquier tipo de texto. Si la cadena contiene un shortcode procesará ese código. De este modo, por ejemplo, podrías mostrar manualmente contenido de tus entradas de este modo:

PHP:
  1. <?php
  2. $content = get_the_content();
  3. echo do_shortcode($content);
  4. ?>

Shortcodes en comentarios

De nuevo recurrimos al fichero functions.php para añadirle este código que permite shortcodes en los campos de comentarios:

PHP:
  1. add_filter( 'comment_text', 'shortcode_unautop');
  2. add_filter( 'comment_text', 'do_shortcode' );

Shortcodes en extractos

Ahora, en functions.php añadiremos esto para poder insertar shortcodes en los extractos de entrada:

PHP:
  1. add_filter( 'the_excerpt', 'shortcode_unautop');
  2. add_filter( 'the_excerpt', 'do_shortcode');

Shortcodes en la descripción de usuario

Para poder meter shortcodes en la descripción del usuario hay que pasar la cadena de descripción por la función do_shortcode(). Para ello tendrás que añadir esto a tu tema activo:

PHP:
  1. <?php
  2. // $user_id = 3;
  3. $userdata = get_userdata($user_id);
  4. echo do_shortcode($userdata->description);
  5. ?>

Solo tendrás que cambiar el ID de usuario, en este caso el 3.

Shortcodes en descripciones de etiquetas, categorías y taxonomías

También puedes filtrar estas descripciones. Para ello recurrimos de nuevo al fichero functions.php:

PHP:
  1. add_filter( 'term_description', 'shortcode_unautop');
  2. add_filter( 'term_description', 'do_shortcode' );

Un mundo de posibilidades más ¿no?

¿Te gustó este post? ¡Compártelo! Bitacoras.com TwitThis Facebook Meneame Google Bookmarks del.icio.us Live Technorati Ping.fm Wikio Turn this article into a PDF! E-mail this story to a friend! Print this article!