Do not speak Spanish? Read this post in English.

Jueves, 14 d octubre d 2010.

Crear una web de clasificados con wordpress: usando custom post y custom taxonomy

Hace algunos meses salio la gran esperada versión 3 de WordPress. Aquella que unificaba WordPress MU con WordPress normal y que añadía los custom posts y las custom taxonomies como una serie de funciones que ya nos permitían salir totalmente de del uso de WordPress como generador de blogs o páginas web textuales y nos permite crear una completa y compleja web a nuestra medida. WordPress ha entrado en terrenos reservados hasta ahora a Drupal y Joomla.

He estado haciendo algunas pruebas y tras entender el sitema es cierto que podemos llegar a montar muchos tipos de webs con estos nuevos añadidos -aunque siempre dentro del orden de datos de wordpress-. En este post intentaré explicar paso a paso como crear las bases de una completa web de clasificados usando wordpress como base.

Empezaremos por el principio -como no- y definiremos como vamos a trabajar para que nuestro código de wordpress sea mínimamente amigable -algo que cuesta mucho conseguir con este sistema tan mal estructurado-. Antes de intentar algo así, debemos tener un poco de experiencia sobre la estructura de programación seguida en wordpress para meternos en este tipo de tareas por lo que recomiendo leer los distintos contenidos del post que publiqué hace tiempo sobre cómo programar en wordpress; sobretodo todo lo referente a acciones y filtros de wordpress.

Includes para ordenar un poco la locura de wordpress

Para empezar lo que haremos será incluir simplemente un include en el archivo "functions.php" de nuestro theme que nos permita separar en un archivo aparte todo lo que vamos a añadir. Este archivo tiende a crecer y crecer con pequeñas funciones de los temas por lo que yo recomiendo separar un poco el código ya que si no al cabo de unos meses no habrá quien pueda tratar lo que hay hecho.

Así que al principio de dicho archivo simplemente añadiremos este include:

include('adds/inline_in_functions.php');

Luego, dentro del propio tema añadiremos la carpeta "adds" y dentro de esta crearemos la menos 2 archivos (quizás más adelante alguno más, pero de momento con 2 creo que basta para separar el código).

Creamos "inline_in_functions.php" y dentro empezamos por declarar una acción "init" -ejecutada al inicio de wordpress- en la que otra vez, simplemente añadiremos un include para separar el código de Init (donde vamos a hacer la mayor parte de los cambios) del resto.

// adding init action as include...
add_action( 'init', 'launchInitScript' );
function launchInitScript() {
  include('init.php'); 
}

Bien! Ahora ya tenemos un archivo separado donde manejar todo el hilo de funciones al inicio del wordpress y otro donde seguir añadiendo pequeñas funciones. Dejémonos ya de incluir archivos y empecemos de una vez con nuestro proposito...

Añadiendo un Custom Post

Empezaremos por añadir un nuevo custom post que representará un tipo de producto de nuestro catálogo. Para ligar el tema con las explicaciones de wordpress diremos que lo que vamos a crear, en vez de posts, serán fichas de libros. Para hacer este añadido debemos usar la función register_post_type(). Veamos un ejemplo:

// dentro de adds/init.php
$args_labels = array(
  'name' => 'Libros', // Nombre del tipo de post creado
  'singular_name' => 'Libro', // Nombre en singular
  'add_new' => 'Añadir 1', // Texto para representar en menús y botones la accion de "añadir uno nuevo"
  'add_new_item' => 'Añadir nuevo libro', // Titulo de la página del admin para añadir un nuevo elemento
  'edit_item' => 'Editar Libro', // Texto del link para editar este tipo de elementos
  'new_item' => 'Añadir Libro', // Texto para el botón de "añadir nuevo" en el botón de la cabecera de wordpress
  'view_item' => 'Ver Libro', // Texto para el botón de "ver" en este tipo de elemento
  'search_items' => 'Buscar Libros', // Texto para el buscador de este tipo de elemento
  'not_found' =>  'No se han encontrado libros', // Texto para mostrar que no hay resultados
  'not_found_in_trash' => 'No encontrado libros en la papelera', // Texto para mostrar que no hay resultados en la papelera
  'parent_item_colon' => '' 
  );
  $args = array(
    'labels' => $args_labels, 
    'public' => true, 
    'publicly_queryable' => true,
    'show_ui' => true, 
    'query_var' => true,
    'rewrite' => true,
    'capability_type' => 'post',
    'hierarchical' => false,
    'menu_position' => 5, // 5 - below Posts, 10 - below Media, 20 - below Pages, 60 - below first separator, 100 - below second separator
    'supports' => array('title','editor','author','thumbnail','excerpt','comments'), // Elementos que contendrá la página de añadir y editar elementos
  'rewrite' => array(
    'slug' => 'libro', // a la hora de crear las urls, cual es la carpeta que contendrá estos elementos
    'with_front' => FALSE
  )
); 
// Con los arrays creados, por fin llamamos a la función Register post Type:
register_post_type('book',$args);

Ahora -tras añadir este código- podemos entrar en el administrador. Encontraremos el nuevo tipo de elemento aparte de posts y páginas: los "Libros". Entramos y creamos nuestro primer elemento, por ejemplo "El Perfume" que tiene por slug: "el-perfume" y por tanto su url final donde podremos ver este libro será algo así como "http://midominio.com/libros/el-perfume".

Sobre esto último, Debemos tener cuidado con los permalinks ya que no se actualizan solos. Tras cada cambio debemos entrar en Ajustes > Permalinks y actualizarlos. Se recomienda seleccionar Estructura personalizada e indicar simplemente: "/%postname%" sin más variables para evitar lo máximo posible las coincidencias. Prueba con unos permalinks así de simples, luego ya jugarás a dejarlos a tu manera.

Ahora que ya vemos nuestros libros seguramente querremos una maqueta ligeramente distinta que la de los
posts para los libros. Para ello wordpress ha cambiado un poco la jerarquía de plantillas:

jerarquía de plantillas en wordpress

Vemos que podemos crear una plantilla especial con el nombre "single-[[Nombre del tipo de post]].php" en nuestro tema. Así que copiamos nuestro single.php le hacemos algún cambio notorio y lo subimos como single-book.php (recordemos que pese a que visualmente estamos creando el el elemento "libros", al lanzar register_post_type() le hemos llamado "book" en la primera variable.)

Añadiendo una Custom Taxonomy

Ahora que ya podemos crear nuevos tipos de elementos en wordpress, lo que nos queda es ver como los organizamos. ¡El nuevo tipo de elemento no va a disponer de Categorías y tags por defecto!

Para añadir distintas clasificaciones lo que haremos será usar la función register_taxonomy() que viene a ser el equivalente a register_post_type pero en categorías. Añadiremos entonces una categorización por "tipos de libros" que afecta al tipo de post "Libro", que hemos llamado "book" internamente (También podríamos añadir categorízaciones nuevas para los posts o paginas llamando a "posts" o "pages").

// dentro de adds/init.php

register_taxonomy('book_type', 'book', array(
  'label' => 'Tipos de libros',
  'singular_label' => 'Tipo de Libro',
  'public' => true,
  'show_tagcloud' => false, 
  'hierarchical' => true,
  'query_var' => true,
  'rewrite' => array(
    'slug' => 'tipo-libro'
  )
));

A destacar que con esta misma función podemos añadir las clasificaciones en forma de Tags o de Categorías que queramos. Simplemente debemos ir haciendo varias llamadas a register_taxonomy() jugando con los parámetros show_tagcloud e "hierarchical". El primero hace que la nueva clasificación se vea como tag en vez de como categoría y el segundo manipula si las categorías pueden ser unas hijas de otras -mas ligado normalmente al comportamiento de categorías que de tags-.

// estilo categorías:
'show_tagcloud' => false, 
'hierarchical' => true,

// estilo tags:
'show_tagcloud' => true, 
'hierarchical' => false,

También resulta interesante echarle un ojo a las posibilidades que se nos dan al declarar el array "labels" donde podemos especificar todos los textos que acompañarán a la administración de la nueva taxonomía para hacerlo todo más lógico y natural. En caso de no usarlo veremos cosas como que al ver en el admin el cuadro de "Tipos de libros" estos se organizan internamente en "Todas las Categorías" y nos permite "Añadir nueva categoría". Por otro lado si hacemos mucho uso de Taxonomías puede resultar realmente incomodo declarar todos los textos de las mismas... Todo dependerá de hasta que punto necesitas decorar el admin.

Bien, una vez hemos añadido nuestra nueva taxonomía podemos ir a nuestro administrador y en la sección "libros" veremos un nuevo elemento del menú "Tipos de lirbos". Entramos y creamos la categoría "de bolsillo" con el slug "de-bolsillo". Ahora al editar o añadir nuevos elementos nos encontramos a la derecha con el nuevo cuadro de selección de categorías donde podemos escoger "de bolsillo". Editemos algunas de nuestras entradas para asignarles esta categoría...

Ahora, con varios elementos asignados a la categoría "de-bolsillo" podemos entrar en la url de esta clasificación y ver los elementos. Si no has hecho cosas raras con los permalinks debería ser una cosa parecida a esta "http://midominio.com/tipo-libro/de-bolsillo".

El problema es que esta va a ser la típica plantilla de posts. No nos gusta, ¡no nos gusta nada! Fijandonos otra vez en la jerarquía de plantillas de wordpress vemos que podemos asignar una plantilla especifica para estos listados creando un archivo llamado "taxonomy-[[nombre interno del tipo de taxonomía]].php" así que, como antes, copiamos el archivo llamado "category.php", lo alteramos un poco y le ponemos el nombre "taxonomy-book_type.php". Ya tenemos plantillas especificas para nuestra taxonomía.

No olvidemos que en esta nueva plantilla nada nos impide manipular el orden de los posts con la funcion query_posts y mostrarlos como nos convega (¿quien dice que el orden cronológico sea el mejor para los libros?). Puedes leer un artículo de aNieto para ver como controlar bien la páginación al hacer este tipo de alteraciones en el query_posts.

Para terminar con todo esto solo nos quedará poder mostrar en nuestras plantillas el acceso a este tipo de categorías. Si no, ningún usuario podría acceder a ellas ;). Para ello pdeberemos usar la función wp_list_categories() que hace la nos permite mostrar cualquier tipo de categorización de la forma acostumbrada. Para llamarla nada tan sencillo como declarar en en el campo "taxonomy" el tipo de taxonomía de la que queremos listar sus categorías, en este caso "book_type", que es string con el que hemos declarado la nueva taxonomía.

$args = array(
    'orderby'            => 'name',
    'order'              => 'ASC',
    'show_last_update'   => 0,
    'style'              => 'list',
    'show_count'         => 0,
    'hide_empty'         => 1,
    'use_desc_for_title' => 1,
    'child_of'           => 0,
    'hierarchical'       => true,
    'title_li'           => 'Tipos de Libros',
    'number'             => NULL,
    'echo'               => 1,
    'depth'              => 0,
    'current_category'   => 0,
    'pad_counts'         => 0,
    'taxonomy'           => 'book_type'
); 
echo wp_list_categories( $args ); 

De la misma forma podremos usar la función get_the_term_list() para mostrar al mostrar nuestro elemento en su página individual las taxonomías a las que está suscrito.

<? echo get_the_term_list( $post->ID, 'book_type', 'Tipo de Libro: ', ', ', '' ); ?>

Esto, pensando en nuestra finalidad, -crear una web de clasificados- nos va a permitir crear como taxonomía, ya sea con forma de categoría o de tag, cualquier cualidad o característica de nuestro elemento. De esta forma podremos ir listando nuestros elementos por cualquiera de sus atributos y mostrar listados individuales de cada uno de estos tipos. Sigamos con el caso de nuestro sistema de clasificación de libros: nada nos impide manejar como taxonomía aspectos como...

- Autores
- Idiomas
- Precios (de 5 a 10, de 10 a 20, etc.)
- Formatos
- Puntos de venta
- Años de edición
- Género
- Etc.

Si, es cierto, acabaremos declarando cientos de caracteristicas y eso en un sistema como wordpress que no destaca por su rendimiento puede no ser lo más productivo. Sin embargo siempre contamos con sistemas de cacheo para que no se nos disparen cpu y ram... ¡tu decides!

Añadiendo Custom Fields (o campos personalizados)

¿No te basta con la categorización y con controlar tus maquetas para cada tipo de contenido y para cada tipo de taxonomía? ¿Necesitas más campos con los que ir clasificando tus fichas de productos? No hay problema porque para eso ya teníamos y podemos aprovechar los campos personalizados de wordpress.

Este es un sistema con el cual podemos añadir campos concretos asociados a cualquier post -o custom post en nuestro caso-. Por defecto pueden trabajarse estos campos con una interfaz que viene ya de serie en el admin de wordpress. La podemos encontrar bajo el texto de cualquier post con el nombre "Campos personalizados" pero no es precisamente usable y segura, por lo que yo preferiría no usarla y pasar a configurar estos campos creando en el admin bloques nuevos hechos a medida para lo que vamos a guardar.

Para mostrarlo con un ejemplo, que siempre es más fácil, lo que haremos será crear como custom field campo personalizado "Precio" asociado a cualquier elemento de libro.

En esta parte de nuestro desarrollo usaremos las acciones (ver referencia de acciones) de "admin_menu" para marcar el punto donde vamos a actuar y los filtros (ver referencia de filtros) de "add_meta_box" para añadir el nuevo cuadro en el admin y de "save_post", "publish_post" y "delete_post" para guardar lo que escribamos en esos campos como campo personalizado del custom post. Sobre como añadir este tipo de variables hay varios post en castellano por internet (la mayoría con el ejemplo de como añadir un Subtitulo a los post) así que no voy a extenderme mucho más explicándolo. Simplemente recalcar que al identificar donde añadimos el add_meta_box() deberemos marcar el string que hemos asignado a nuestro custom post -en nuestro caso "book"- para que se añada el cuadro a su propia página de añadir nuevo elemento y editar elemeneto. Seguidamente un código de ejemplo:

// dentro de adds/inline_in_functions.php

// Apadiendo funciones a lanzar en la acción 'admin_menu'
add_action('admin_menu', 'launchAdminMenuScript');
function launchAdminMenuScript() { 
  // Añadiendo cuadro de precio al formulario
  add_meta_box('precio','Precio','addAdmin_Precio','book','normal','high');
  // notese que marcamos el entorno como 'book'
}

// funcion llamada para crear el add_meta_box
function addAdmin_Precio()
{	
  $fieldName = 'price';
  $labelName = 'Precio';
  global $wpdb, $post;
  echo '<label class="hidden" for="'.$fieldName.'">'.$labelName.'</label><input type="text" name="'.$fieldName.'" id="'.$fieldName.'" value="'.htmlspecialchars(get_post_meta($post->ID, $fieldName, true)).'" style="width:90%" />';
}

//Añadiendo que el campo se guarde como custom field: http://codex.wordpress.org/Custom_Fields 
add_action('save_post', 'guardar_precio');
add_action('publish_post', 'guardar_precio');
add_action('delete_post', 'borrar_precio');
function guardar_precio() {
  $fieldName = 'price';
  global $wpdb, $post;
  $post_id=($post_id)?$post_id:$_POST['post_ID'];
  if (!$post_id) return $post;
  update_post_meta($post_id, $fieldName, $_POST[$fieldName]);
}
function borrar_precio() {
  $fieldName = 'price';	
  global $wpdb, $post;
  $post_id=($post_id)?$post_id:$_POST['post_ID'];
  if (!$post_id) return $post;
  delete_post_meta($post_id, $fieldName);
}

A partir de estos añadidos veremos como se añade bajo el cuadro de texto del admin de libros un nuevo cuadro donde podemos escribir el precio de los libros.

Para luego mostrar en nuestras themes esta nueva variable lo más seguro es que usemos la función get_post_meta() que nos permite rescatar cualquier custom field asociado a un post (también es posible que queramos extraerlos todos a la vez con la función the_meta() pero en la práctica seguramente preferiremos sacar cada uno de estos datos cuando los necesitamos uno a uno).

Su uso es bastante simple, por ejemplo para sacar el precio dentro del loop del post:

<p>Precio: <? echo get_post_meta($post->ID, 'price', true); ?></p>

Urls con filtros

¿Y que nos falta para terminar de considerar a nuestra web en wordpress toda una web de clasificados? Pues los filtros. No hay web de clasificados que no ofrezca al usuario distintas formas de ordenar los contenidos que ve. WordPress por defecto lo ordena todo por fecha de creación y aunque ya hemos visto antes que podemos cambiar ese orden para cualquier plantilla lo cierto es que es iluso pensar que todos los usuarios se conformarán con el orden de elementos que nosotros les demos.

Para este útlimo paso lo que haremos será mezclar lo que ya conocemos sobre ordenar de los post en wordpress con el uso de las expresiones regulares de este para crear urls de que modifiquen el orden de aparición de los elementos. Más o menos vendrá a ser lo explicado en la última parte de dicho artículo solo que adaptado a todas las taxonomías que hayamos creado en vez de a la categorización genérica de WordPress. Por favor, lee el artículo porque no voy a entrar aquí en detalle de porque se usan las funciones que se usan.

Lo dicho. Simplemente, se trata de crear las expresiones regulares concretas que ordenarán nuestros posts pero deberemos hacerlo (como decíamos) para cada una de las taxonomías creadas. Veamos un ejemplo de como sería la creación de urls que ordenen los post de tipo "libro", en la taxonomía de "tipo de libro" por el valor del campo personalizado "precio", mezclando todo lo tratado en este último punto...

// dentro de adds/inline_in_functions.php

//Añadiendo nuevas reglas de rewrite: http://codex.wordpress.org/Function_Reference/WP_Rewrite
add_filter('rewrite_rules_array','addOrders');
// añadiendo la nueva regla de orden.
function addOrders($rules)
{
  //querypost vars at: http://codex.wordpress.org/Template_Tags/query_posts
  $newrules = array();

  // "tipo libro" por "precio"
  // NOTA: usar la declaración con comillas simples (') para que las variables $matches no sean reemplazadas en la propia declaración
  $newrules["tipo-libro/([^/]+)/por-precio/?$"] = 'index.php?orderby=meta_value_num&meta_key=precio&order=asc&book_type=$matches[1]';

  // Y lo mismo pero para resultados páginados
  $newrules["tipo-libro/([^/]+)/por-precio/page/?([0-9]{1,})/?$"] = 'index.php?book_type=$matches[1]&paged=$matches[2]&orderby=meta_value_num&meta_key=precio&order=asc';

  // añadimos las reglas al PRINCIPIO del array	
  $rules = $newrules + $rules;
  return $rules;
}

// FLUSH!!!!
add_filter('init','flushRules');
// Hay que hacer flush de las reglas al menos una vez para que se den de alta.
function flushRules(){
  global $wp_rewrite;
  $wp_rewrite->flush_rules();
}

Bien, ahora ya podemos probar a cargar las urls que acabamos de crear:

- http://midominio.com/tipo-libro/de-bolsillo/por-precio
- http://midominio.com/tipo-libro/de-bolsillo/por-precio/page/2

Y ver como el orden los posts pasa a depender del precio que les hemos indicado en el campo personalizado "precio".

Alguien puede pedir más?

Temas Relacionados: programacion tutoriales

Autor:

32 Comentarios para “Crear una web de clasificados con wordpress: usando custom post y custom taxonomy”

  1. DUQUE dice:

    Joder me acabas de hacer sentir un pringao a tu lado Jajaja, secundo a José B. Moreno.

  2. xavier dice:

    Como podria hacer caducar post en wordpress.
    Automaticamente desde el archivo functions de mi tema. Los post serian obtenidos a traves de un formulario realizado en gravityforms.
    Mi intencion seria de variar el tiempo segun el usuario.

    Usuario Plata, post valido por 30 dias.
    Usuario oro, post valido por 60 dias etc...

    Te agradeceria tu alluda dado que no se programar, estoy montando una web wordpress a base de copia pega de foros etc...

    Mi tema está creado con artisteer con variacion de aspecto de Templateer. Gracias de ante mano, espero me puedas dar solucion, dado que visto lo leido lo dominas mucho. Gracias. Un saludo

  3. ikhuerta dice:

    Jose, Duque, gracias por vuestros comentarios. De amo na! Solo es dedicarle horas que la doc de WordPress es una *** y si no lo masticas un poco no hay forma :)

    Xavier, Sinceramente creo que si no sabes programar lo que te propones es muy muy complicado. Estas intentando autopublicar desde herramientas de terceros en tu un blog, con distintos tipos de usuarios y con caducidad de los posts... No crees que todas estas horas que estás empleando te saldrían más a cuenta contratando a alguien el desarrollo?

    Se me ocurren formas de hacer lo que dices pero ninguna así automática desde el functions.

  4. saul dice:

    Hola, que tal?

    Tengo una pregunta para un proyecto que estoy haciendo. Resulta que es un directorio de empresas. He creado custom posts para Academias, Tiendas y Locales por ejemplo. Hasta ahi bien, luego una taxonomia que se llama provincia dentro de cada una de ellas, y ahi es cuando viene el lio porque al llamar http://www.misition.com/provincias/valencia no sabe de que tipo de post mostrar....

    En tu ejemplo sería como ademas de libros, tener otra que sea calculadoras y dentro la taxonomioa de-bolsillo tambien...que pasaria en ese caso?

    Muchas gracias!

  5. ikhuerta dice:

    Hola Saul,

    Supongo que tu problema es que le pones el slug "provincias" a todas las taxonomias de provincia que creas. Esta claro que tal y como tiene montadas wordpress las urls (en las que las taxonomias no dependen del tipo de contenido al que se aplican sino que parten de raiz) no puedes hacer eso porque crea la misma regla de rewrite para ambas (para ambas busca urls que empiecen por "/provincias/" y siempre una saldra perdiendo.

    Solución: No uses el mimso Slug 😉

    Podrias usar antes el tipo de contenido, incluso intentando categorizarlo por el tipo de post.

    Así:

    Dando de alta como slug "provincias-de-academias"

    /provincias-de-academias/valencia

    Si el sistema te deja puedes intentar hasta clavarle slashes para hacerlo más lógico (pero no se si te dejará, prueba a ver).

    Dando de alta como slug "academias/por-provincias" (si te deja, ya te digo que no se).

    te quedarian los posts como...

    /academias/mi-academia

    y luego las provincias como

    /academias/provincias/valencia

    Suerte!

  6. saul dice:

    Hola Iñaki, muchas gracias por contestar.

    He estado probando lo que me aconsejas y parece que se traga los slugs con "/", asi que la opción academias/provincia me viene de lujo, eres un crack;)

    Lo que no tengo un claro es como se visualiza un listado de "Academias" por ejemplo, porque el loop me está mostrando las entradas normales, no las de algun custom post en particular..si pongo en la url directamente miweb.com/academias al no ser una categoría no me hace ni caso..

    Un saludo y muchas gracias!

  7. saul dice:

    he encontrado este plugin que parece que resuelve esa laguna: http://wordpress.org/extend/plugins/simple-custom-post-type-archives/

    Ahora a ver si encuentro un generador de sitemaps que soporte custom types y que incluya las categorias también....

    saludos!

  8. ikhuerta dice:

    Buen plugin Saul,

    la verdad es que a mi también me extrañó que no te diese una home o listado sin filtrar para los custom posts sin categoría. Siempre puedes hacerlo usando 'query_posts' y 'rewrite_rules_array' para crear una nueva url en tu wordpress que lance la query exacta que deseas.

    Sería lo que se explica en este post ( http://blog.ikhuerta.com/ordenar-posts-en-wordpress ), pero aplicandolo para tu necesidad concreta.

  9. saul dice:

    Voy a revisar el post que me dices, porque ahora lo que no tengo es una página de provincia, esa supongo que me tocará hacerla a mano...Es decir misitio.com/provincia/valencia o misitio.com/valencia y que aparezcan todas las academias, tiendas, locales, etc de esa provincia.

  10. saul dice:

    Hola de nuevo Iker,

    Sobre el tema de los customs posts, estoy pensando en hacer un tipo que sea "usuario". Es decir que cada usuario registrado tenga un post asignado /usuario/saul, crees que es mucha locura que por cada usuario que se registre se cree un post asociado a el? El post tendria formato de ficha de perfil o algo parecido, con un admin detrás.

    Un saludo!

  11. saul dice:

    Perdona lo de iker, he tu nick ikhuerta y me he liado...

  12. ikhuerta dice:

    no hay problema saul, es algo corriente que la gente lea "ik" y piense que es "iker", fallo mio 😉

    Sobre lo que comentas tu decides si es importante para lo que estás montando o no. Yo solo te llamo la atención sobre lo que creo que creo que deberías fijarte para decidir:

    - No te lies antes de salir a producción con nada que no sea vital para ti. Si vas a capturar la info de usuarios, hazlo como veas oportuno, pero no pienses en páginas si no tienes necesidad de usarlas. Primero comprueba como se comportan tus usuarios y luego ya verás si esas fichas te aportan algo o no. Es como el que piensa en si pagina comentarios, los carga por ajax, los liga a facebook, etc... primero preocupate porque se comente, y luego ya verás como lo muestras.

    - Piensa en si es más comodo crear un custom post o tablas por separado. Para hacer fichas de productos puede ser útil, pero por experiencia te digo que intentar meter cosas demasiado abstractas en el formato de wordpress a la larga solo trae problemas. Si vas a liarala mucho yo te recomendaría antes que jugases con desarrollo propio, dentro de wordpress pero con tus tablas, controladores y modelos propios.

    - WordPress es versatil, pero no está bien hecho. Cuanto más lo compliques más vas a notarlo en rendimiento. Es relativamente fácil morir del éxito en wordpress... a mi me ha pasado de tener un proyecto demasiado "tuneado" y luego tener que pedir ayuda extena de sistemas para que no me tumbasen el servidor. Siempre puedes poner caché, claro, pero cuidado con lo que te consume wp.

  13. Gabriel dice:

    Hola que tal,
    Muy buena guia. La estoy siguiendo paso a paso, pero tengo el siguiente problema. He creado el archivo taxonomy-tipo-libro.php pero cuando accedo a las categorias no me toma el template definido en el archivo taxonomy-tipo-libro sino que me muestra el original. Que es lo que estoy haciendo mal?

    Muchas Gracias.

  14. Tengo un problema, los articulos publicados en el nuevo custom post no aparecen en la pagina correspondiente de autor, ¿como puedo solucionar eso? gracias.

    Me aclaro mucho tu tutorial.

    Gracias.

  15. Nod Kopfnickend dice:

    No suelo comentar en los blogs... no se por que, pero esta vez me veo en la obligacion para agradecerte. Muy bueno, Copie y Pege el codigo y salio andando.

    Gracias!

  16. Superproblema dice:

    Lo primero gracias por el articulo, como bien dicen eres el puto amo. Mira yo soy un poco catetillo en esto, pero a ver si me puedes ayudar. Me gustaria saber como añadir una decripcion a mi custom field. Es decir que ademas de que aparezca "Precio" y el campo de texto, aparezca una descripcion tipo "introduce aqui el precio del producto", no se si me explico bien o lo que es peor que la respuesta este en el articulo y no sea capaz de verla. Gracias de nuevo!!

  17. ikhuerta dice:

    Buenas

    En el trozo de codigo que sirve para mostrar ese campo en el admin, solo debes sustituir la variable $labelName donde dice 'Precio' por lo que quieras que aparezca:

    // funcion llamada para crear el add_meta_box
    function addAdmin_Precio()
    {
    $fieldName = 'price';
    $labelName = 'Precio';
    global $wpdb, $post;
    echo '';
    }

  18. Links dice:

    Hola ikhuerta, antes que nada mis felicitaciones por compartir info.
    Quería preguntarte tres cosas:

    1) cómo hago para que "libros" además de de un post raíz (custom) sea también una categoría principal en el listado de categoria de libros. Ej Tipos de Libros: Libros > Novelas > Españolas —la idea es que en mi menu general pueda crear un item (boton) que se llame "libros" y al hacer click allí, me duvuelva todos los post publicados en diferentes subcategorias bajo la categoria princial Libros.

    2) Cómo logro una página de categoria personalizada? con el single.php no he tenido problemas, pero te comento el escenario:
    En Tipos de Libros, cree la categoria "General" (slug: general) luego publico alli un nuevo "post libros" (libro 1) y otro más (libro 2).
    cuando hago click en (libro 1) todo bien, me devuelve el single-books.php pero cuando click en la categoria "General" no me toma el category-general.php para mostrarme los posts ordenados unos debajo del otro pertenecientes a esa categoria.

    3)Cómo borrar todos los campos que no sean "custom fields" y que aparecen en el editor del post, me explico? quitar la barra tiny de edicion, campo comentarios.. etc. Que solamente queden mis campos personalizados, tipo formulario.

    Bueno, disculpame tan largo email, pero estoy entusiasmado con esto que me has compartido.

    Un abrazo!

  19. martin dice:

    muy buena info.. Gracias

  20. Excelente, de mucha utilidad!!!! gracias!!! ahora a ponerlo en práctica y luego comentarte los resultados

  21. Excelente tutorial solo una correccion que me tubo dando vueltas toda la tarde y no funcionaba...

    taxonomy-[[nombre del tipo de taxonomía]].php

    tal vez obiaste de comentar que en esta parte se debe pober el nombre interno de la taxonomia, en el caso de tu ejemplo...

    taxonomy-[book_type].php

    por lo demas muchas gracias de gran utilidad!!!

  22. ikhuerta dice:

    Corregido para que se entienda mejor. gracias por el apunte!

  23. Ariel dice:

    Hola Iñaki antes que nada muy buen post, el motivo de consulta es que no puedo hacer que ande el archive del Custom post me manda la ahome probe archive-post_type, taxonomy-post_type y así fuí probando pero nada el single anda perfecto. Saludos y gracias por todo.

    • ikhuerta dice:

      Desde que arreglaron estos problemas en las ultimas versiones de wordpress (asegurate de actualizar) el formato es:

      archive-[custompostID].php
      y
      single-[custompostID].php

      Te aseguro que ambos funcionan. Eso si: vigila que lo que usas es el id del Custom post y no otro valor y que al crearlo uses las variables de crear pagina de archivo y publicar en la web correctamente o las páginas no existirán.

  24. Oscar dice:

    Hola, primero muchas gracias por tu post, la verdad que es de gran ayuda!, aunque tengo una duda, estoy usando la ultima versión de WordPress, y estoy siguiendo el ejemplo pero con actividades, el problema viene que no filtra las categorías, me dice que la página no existe, si miro la página de actividad funciona correctamente pero al filtrar por categoría da el error.

    Por ejemplo esto funciona, /actividad/nombre-de-empresa-y-actividad/

    Pero desde esa página si quiero ver las entradas correspondientes a esa actividad no las muestra, ejemplo:

    /tipo-actividad/alquiler-de-barcos/

    Espero que me puedas ayudar, gracias!!

  25. Oscar dice:

    Hola, lo acabo de solucionar ya me funciona el ejemplo, pero le acabo de añadir la taxonomy provincia para filtrar por tipo de libro y a la vez por provincia pero no me muestra nada, añadido lo siguiente:

    register_taxonomy('provincia_type', 'book', array(
    'label' => 'Provincias',
    'singular_label' => 'Provincia',
    'public' => true,
    'show_tagcloud' => false,
    'hierarchical' => true,
    'query_var' => true,
    'rewrite' => array(
    'slug' => 'provincia'
    )
    ));

    y en newrules he puesto

    $newrules["tipo-libro/([^/]+)/provincia/?$"] = 'index.php?book_type=$matches[1]&provincia_type=$matches[2]';

    si pongo /provincia/madrid/ si que muestra los resultados pero si pongo:

    /tipo-libro/nombre-libro/provincia/madrid/ no muestra nada, me podéis ayudar?, gracias.

  26. ikhuerta dice:

    Buenas Oscar, me alegro de que solucionases tu primer problema.

    En cuanto al segundo lo que veo es que no has reemplazado algunas variables... y otras siguen estáticas.

    Cada custom taxonomy necesita de una variable declarandola. Por ejemplo "provincia_type" la pones bien, pero book_type no creo que la tengas declarada como taxonomia.

    POr otro lado, cada variable a capturar como $matches[1], $matches[2] etc debes meterla en la expresión regultar entre paréntesis para que pueda detectarla.

    En tu ejemplo, como solo pones entre paréntesis el primer elemento, lo que hará la nueva regla es:

    - Detectar URLs del tipo /tipo-libro/[VARIABLE1]/provincia
    - Y lanzar la consulta a wordpress de index.php?book_type=[variable1]&provincia_type= (estando vacio pues no hay matches[2])

    Creo que deberías probar con una regla del tipo:

    $newrules["tipo-libro/([^/]+)/provincia/([^/]+)/?$"] = 'index.php?book_type=$matches[1]&provincia_type=$matches[2]';

    Para poder llenar $matches[2]...

  27. Jose dice:

    Excelentes exposiciones, ikhuerta. Suelto la pregunta porque estoy más perdido a cada paso que doy, así que empezar de cero y vaciar toda idea. Ya he reinstalado 2 veces WP de tanto tocar.

    La idea es crear un portal, y dentro de éste, el directorio de actividades por comunidad autónoma. Esta sería la estructura:

    Andalucía/Málaga/Torremolinos/Actividad X
    Andalucía/Sevilla/Dos Hermanas/Actividad X
    Cantabria/Santander/San Vicente de la Barquera/Actividad X
    Extremadura/Badajoz/Sagrajas/Actividad X

    El denominador común es la actividad X, que serían unas 100 actividades. La pregunta es cómo demonios creo la estructura, que tengo que hacer, si hay que usar algún plugin que haga ésto... porque tirando sólo a categorías me la veo complicada y muy repetida. También quisiera saber cómo creo el formulario para éstas cosas, tipo clasificados. Se aceptan sugerencias. He probado casi todos los plugins actualizados free existentes para directorios y no me sirve ninguno.

    El portal tendría un apartado de noticias, aquí he pensado en usar los post por defecto de WP, videos, fotos... pero bueno, con ésta parte me defiendo mejor...

    Gracias por todas las ayudas!!!

    • ikhuerta dice:

      El tema de usar categorias como filtros (que es lo que tu quieres al anidarlas) no está bien resuelto en wordpress y tiene que hacerse a base de complejos hacks en las funciones.

      - 1 Crear esas páginas en los permalinks
      - Detectar en la página index de tu theme que es una consulta con dos categorias a la vez.
      - 3 crear tu el queryposts de esa consulta con varias categorias a la vez.

      WPQuery te lo va a permitir pero ni el sistema de urls ni de templates vienen preparados para hacer eso.

      Quizas una solución más sencilla si solo necesitas dos niveles de profundidad es crear cada categoría como custom post.

  28. Renzo dice:

    Gracias, excelente exposición:
    COnsulta. Por que crees que al cambiar

    'slug' => 'libro',

    'libro' por otra palabra como 'restaurantes' no me devuelve el post? He de hacer el cambio en otro sitio mas?

    • ikhuerta dice:

      Si estas haciendo pruebas continuamente recuerda refresar las urls de wordpress cada vez. Para eso o usas la sentencia de flush que pone ahi (y luego la borras!) o te vas a permalinks en el admin y le das a actualizar.

      Si definiste bien como publicos los nuevos post-types las paginas se crearán

Anímate y deja tu comentario

Esto son experimentos, no preguntes ;) prueba metadescription Juego Prueba title Más tests Y más

render4