Blog personal de IT, viajes y otros hobbies

tabla wp_post de WordPress

wp_posts el corazón de WordPress

Cada vez es más sencillo instalar un WordPress en un ordenador, solo necesitamos poder ejecutar PHP y una base de datos MySQL nueva. Pero esta simpleza también ha hecho que mucha gente desconozca que sucede «detrás de escena». De poco sirve estudiar o leer artículos sobre plugins, taxonomías o jerarquías de plantillas si no entendemos cómo y dónde se guarda la información. La base de datos de WordPress puede parecer a simple vista compleja pero en realidad tiene una lógica muy simple y flexible. En este artículo haré una breve introducción a la tabla más importante del CMS: wp_posts.

Analizando la tabla wp_posts

La tabla wp_posts es una de las más importantes de la base de datos ya que en ella se puede almacenar la información de las distintas entidades que conformarán nuestra web.  Aunque por el nombre de la tabla parezca que solo guarda los «Posts» de nuestro blog, también almacena las páginas, adjuntos, ítems de menús e información personalizada que veremos más adelante.

Tabla WordPress wp_posts
La tabla wp_posts está compuesta por 23 campos (v4.4)

Los registros de esta tabla se diferencian básicamente por el campo «post_type» quien determina el tipo de entidad. Por defecto WordPress carga registros con el tipo «post» (posts del blog), «page» (páginas), «attachment» (para los adjuntos) y «nav_menu_item» (ítems de menús).

registros wp_posts

Esto significa que cuando damos de alta un nuevo post, página o un ítem de menú en nuestro web se inserta un nuevo registro en la tabla «wp_posts» registrando el ID, título, fecha de creación, post_type entre otros campos.

¿Qué otros campos tiene la tabla?

La tabla wp_posts está conformada por los siguientes campos:

  • ID (BIGINT): Identificador único.
  • post_author (BIGINT): ID del usuario que creó el post.
  • post_date (DATETIME): Fecha y hora de creación del post.
  • post_date_gmt (DATETIME): Fecha y hora GMT de creación del post.
  • post_content (LONGTEXT): Contenido del post.
  • post_title (TEXT): Título del post.
  • post_excerpt (TEXT): Extracto ó resumen del contenido del post que suele mostrarse en otras páginas.
  • post_status (VARCAR): Estado del post: publicado, borrador, eliminado, etc.
  • comment_status (VARCHAR): Estado de los comentarios del post: abierto ó cerrado.
  • ping_status (VARCHAR): Estado de los «ping»: abierto ó cerrado. Si está «abierto» guardará como un comentario cualquier referencia externa que hagan al post.
  • post_password (VARCHAR): Este campo se utiliza para proteger nuestro post con una contraseña. Después de hacer la prueba pude verificar que no aplica ninguna encriptación.
  • post_name (VARCHAR): El slug del post que se utilizará en los enlaces.
  • to_ping (TEXT): Según la documentación es una lista de URL’s para enviar pings. Nunca lo usé.
  • pinged (TEXT): Según la documentación es una lista de URL’s a las que se les envió un ping. Al igual que la anterior nunca la usé.
  • post_modified (DATETIME): Fecha y hora de última modificación del post.
  • post_modified_gmt (DATETIME): Fecha y hora GMT de la última modificación del post.
  • post_content_filtered (LONGTEXT): WordPress utilizar este campo para almacenar temporalmente el contenido de nuestro post mientras lo editamos. Esta información temporal se elimina cuando se guarda, actualiza o publica el post.
  • post_parent (BIGINT): Identificador del post padre.
  • guid (VARCHAR): Enlace del post.
  • menu_order (INT): Número que indica el orden que tiene el ítem de menú. No entiendo cómo todavía este campo no está en la tabla wp_postmeta.
  • post_type (VARCHAR): Hala, nuestro campo identificador de post (o entidades como me gusta llamarlo).
  • post_mime_type (VARCHAR): En caso de un «attachment» se guarda en este campo el mime/type del fichero, ej.: ‘image/jpeg’. Otro campo que hubiese mudado a wp_postmeta.
  • comment_count (BIGINT): Contador de comentarios que tiene el post.

Generando nuestra entidad

Existirán casos donde será necesario generar nuestras propias entidades para cumplir con los requisitos del proyecto, por ejemplo: Un cliente nos ha pedido que realicemos una página web. Esta estará compuesta por un blog, algunas secciones estáticas («Quienes somos» y «Formulario de contacto») y un listado de «Proyectos» para promocionar los trabajos que realizan en su agencia.

  • Para el blog podemos utilizar la sección de «Entradas» que viene por defecto en WordPress, es decir el post_type ‘post’.
  • Para las páginas utilizamos la sección «Páginas» que viene por defecto, o sea el post_type ‘page’.
  • Y para el gestionar las altas, bajas y modificaciones de los «Proyectos» tendremos que generar un nuevo post_type llamado «proyecto» utilizando la función «register_post_type()«. Este código debe estar dentro del «functions.php» del tema o en el fichero principal del plugin que estemos desarrollando.
function create_proyectos_post_type() {
    $labels = array(
        'name'               => 'Proyectos',
        'singular_name'      => 'Proyecto',
        'menu_name'          => 'Proyectos',
        'name_admin_bar'     => 'Proyecto',
        'add_new'            => 'Agregar nuevo',
        'add_new_item'       => 'Agregar nuevo Proyecto',
        'new_item'           => 'Agregar Proyecto',
        'edit_item'          => 'Editar Proyecto',
        'view_item'          => 'Ver Proyecto',
        'all_items'          => 'Todos los proyectos',
        'search_items'       => 'Buscar proyectos',
        'parent_item_colon'  => 'Proyectos padres:',
        'not_found'          => 'No se encontraron proyectos.',
        'not_found_in_trash' => 'No se encontraron proyectos en la papelelera.'
    );
    $args = array(
        'labels'             => $labels,
        'public'             => true,
        'publicly_queryable' => true,
        'show_ui'            => true,
        'show_in_menu'       => true,
        'query_var'          => true,
        'rewrite'            => array( 'slug' => 'proyectos' ),
        'capability_type'    => 'post',
        'has_archive'        => true,
        'hierarchical'       => false,
        'menu_position'      => null,
        'supports'           => array( 'title', 'editor', 'thumbnail', 'excerpt' ),
        'menu_icon'          => 'dashicons-analytics'
    );
    register_post_type( 'proyecto',$args);
}
add_action( 'init', 'create_proyectos_post_type' );

Al igual que ‘page’, ‘post’ y ‘attachment’ este nuevo tipo de dato también tendrá los mismos campos de la tabla wp_posts. Como estarán imaginando con los campos ‘título’ y ‘contenido’ no podremos llegar demasiado lejos. Calma. Se pueden agregar campos extras a cualquier tipo de ‘post’ pero eso lo dejamos para un nuevo artículo.

Custom Post Type Proyectos
Custom Post Type Proyectos generado con la función register_post_type()

Plantillas para los Custom Post Types

Así como hemos creado el Custom Post Type para poder gestionar los datos desde el administrador, también podremos mostrar la información en el Frontend haciendo uso de la jerarquía de plantillas de WordPress.

  • single-{slug}.php => single-proyecto.php para mostrar la página de un proyecto en particular.
    • De no existir el fichero en nuestro tema usará el single.php, singular.php o en el último caso el index.php.
  • archive-{slug}.php => archive-proyecto.php para mostrar la página con el listado de proyectos.
    • De no existir el fichero usará el archive.php o en el último caso el index.php.

Insertando registros por programación

Dependiendo de los requisitos del proyecto se puede dar el caso en que necesitemos insertar posts mediante programación. Un ejemplo podría ser que nuestro cliente, un arquitecto reconocido, quiere agregar un formulario en su página para que los visitantes puedan cargar datos para el desarrollo de un «presupuesto» (posible nombre para el Custom Post Type) con los siguientes campos:

  • Medidas de la habitación en m².
  • Tipo de obra (construcción, reforma).
  • Descripción de la obra a realizar.

Cuando se envíe el formulario con los datos cargados utilizaremos la función wp_insert_post() de WordPress en donde especificaremos en sus parámetros qué tipo de post estamos insertando, en este caso de ejemplo un post_type «presupuesto».

$postarr = array(
    "post_content" => "Necesitamos hacer una gran reforma en nuestra cocina. Hay una columna que...", // Este texto vendrá en las variables $WP_POST del formulario.
    "post_title" => "Presupuesto - 07/03/2016", // Generamos un título aleatorio para nuestro post (podemos usar la fecha, el ID, el nombre del cliente o lo que queramos.
    "post_status" => "publish",
    "post_type" => "presupuesto",
);
wp_insert_post($postarr);

Prefijos de las tablas WordPress

Vale aclarar que el prefijo de la tabla «wp_posts» no será siempre «wp_«. El instalador de WordPress utiliza la constante $table_prefix en el fichero wp_config.php para asignar dicho valor. Es recomendable cambiarlo para dificultar los intentos de accesos indeseados a nuestra base de datos.

//$table_prefix  = 'wp_';   // Default prefix
$table_prefix  = 'prjkt_';  // Modified prefix

Conclusión

Con este artículo has aprendido que la misma base de datos de WordPress puede dar soporte a cualquier entidad que necesites para tu página web. Utiliza la función register_post_type() e implementa todos los «Custom Post Types» que necesites. En un próximo artículo veremos como expandir este nuevo tipo de datos con campos personalizados.

Anterior

Optimiza tus Javascripts en WordPress

Siguiente

Campos personalizados en WordPress con ACF

  1. Gracias por el artículo.
    Comento una duda, por si pueden darme una pista.
    En uno de mis blogs, cada vez que optimizo la base de datos, el contenido de la tabla wp_posts desaparece. Es decir, que el blog se queda vacío y tengo que restaurar la base de datos y los archivos desde el servidor. Por este motivo no puedo usar ningún plugin de optimización ni optimizar la base de datos desde PhPMyAdmin desde el panel de control del servidor.
    ¿Solo me pasa esto a mí?
    Muchas gracias.

  2. Gracias Mau me has ahorrado unas horas de trabajo!!

  3. Ruben Mora

    Hola muy buen articulo, estoy comenzando a desarrollar en wordpress con custom post types, e programado en php estructurado y MYSQL, mi duda con la tabla wp_postmeta es la siguiente, tengo un post type alumno y relleno los datos del alumno y lo inserto por primera vez y me crea un registro con los metadatos en el wp_postmeta y me crea un post, si yo actualizo por decir el teléfono del alumno y el titulo, y al yo actualizarlo me vuelve a crear otro registro con los cambios realizados o me sobre escribe el registro ya existente, gracias de antemano, saludos

    • Hola Rubén:
      Es una buena pregunta. WordPress guarda varios registros de un mismo «alumno» a modo de seguridad. La tabla wp_post tiene un campo llamado «post_status» que te indica en qué estado se encuentra el post. Siempre habrá un solo registro de «alumno» con el post_status = «publish». Ese es el que se modificará. Los demás serán simple «revisiones» por si en algún momento quieres recuperar la información.
      Te sugiero que le eches un vistazo a esta charla sobre base de datos de WordPress que di en la WordCamp de Santander => https://wordpress.tv/2016/11/20/la-base-de-datos-de-wordpress-12-tablas-que-valen-pato-y-un-poco-mas/

      Un saludo,
      Mauricio

  4. Cristina

    Hola.
    Y como puedes hacer búsquedas por esos campos personalizados creados con ACF ?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Funciona con WordPress & Tema de Anders Norén