Consulta MySQL para Recuperar Categorías desde wp_posts

21 may 2017, 20:57:48
Vistas: 24K
Votos: 6

Usando esta consulta para recuperar todas mis entradas con un post_type específico

SELECT *
FROM wp_posts
WHERE post_type = 'product';

Como se describe aquí la categoría no está en la tabla wp_posts sino en las tablas de términos wp_terms wp_term_relationships wp_term_taxonomy

Buscando a través de todas las tablas una categoría que tenía en mente, la única instancia de una categoría que pude encontrar estaba en la tabla wp_terms que contiene las siguientes columnas

  • term_id
  • name
  • slug
  • term_group

Buscar referencias cruzadas de esto en otras tablas y de alguna manera relacionarlas con wp_posts está presentando algunas complicaciones.

Mi pensamiento es que debería buscar el term_id ya que parece una clave foránea, pero la única instancia de eso está en wp_term_taxonomy, y la única información que puedo encontrar en la tabla relacionada con mi categoría (o más bien term_id) es

  • term_taxonomy_id
  • term_id
  • taxonomy
  • description
  • parent
  • count

Entonces la única información que puedo obtener de esto me permite saber que mi term_id taxonomy es un product_cat y en count me dice cuántas entradas tengo para esta categoría en particular.

Sabiendo un poco sobre MySQL, sé que si hay alguna esperanza de hacer esto necesito modificar mi consulta y hacer uno o dos JOIN.

Pero solo estoy encontrando información muy limitada sobre qué exactamente puedo utilizar.

Aquí está la estructura de wp_posts

 `wp_posts` (
 `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
 `post_author` bigint(20) unsigned NOT NULL DEFAULT '0',
 `post_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 `post_date_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 `post_content` longtext COLLATE utf8mb4_unicode_520_ci NOT NULL,
 `post_title` text COLLATE utf8mb4_unicode_520_ci NOT NULL,
 `post_excerpt` text COLLATE utf8mb4_unicode_520_ci NOT NULL,
 `post_status` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'publish',
 `comment_status` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'open',
 `ping_status` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'open',
 `post_password` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
 `post_name` varchar(200) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
 `to_ping` text COLLATE utf8mb4_unicode_520_ci NOT NULL,
 `pinged` text COLLATE utf8mb4_unicode_520_ci NOT NULL,
 `post_modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 `post_modified_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 `post_content_filtered` longtext COLLATE utf8mb4_unicode_520_ci NOT NULL,
 `post_parent` bigint(20) unsigned NOT NULL DEFAULT '0',
 `guid` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
 `menu_order` int(11) NOT NULL DEFAULT '0',
 `post_type` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'post',
 `post_mime_type` varchar(100) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
 `comment_count` bigint(20) NOT NULL DEFAULT '0',
 PRIMARY KEY (`ID`),
 KEY `post_name` (`post_name`(191)),
 KEY `type_status_date` (`post_type`,`post_status`,`post_date`,`ID`),
 KEY `post_parent` (`post_parent`),
 KEY `post_author` (`post_author`)
 )

¿Es siquiera posible modificar mi consulta para recuperar solo las filas de la tabla wp_posts para categorías específicas?

2
Comentarios

¿Por qué necesitas acceder a esto directamente con SQL cuando existe la clase WP_Query que puede hacerlo por ti?

Cedon Cedon
21 may 2017 21:44:02

Nunca había escuchado de eso. Voy a investigarlo. Solo estoy experimentando con ediciones masivas de mi post_content en la tabla wp_posts en mi localhost usando mi propio script PHP fuera de WordPress. Luego lo importo de vuelta a mi sitio en producción, algo así. Funcionó bien hasta que necesité filtrar por categorías

bbruman bbruman
21 may 2017 22:04:29
Todas las respuestas a la pregunta 4
1
15

Lo resolví. @belinus es probablemente la solución para ti si estás buscando hacer esto dentro de WordPress.

En cuanto a una consulta SQL básica con la que puedes experimentar, encontré esta, la modifiqué un poco y devuelve todos los productos para una categoría en particular.

Se requieren tres tablas para hacer esto: wp_posts, wp_term_relationships y wp_term_taxonomy.

SELECT *
FROM wp_posts
LEFT JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
LEFT JOIN wp_term_taxonomy ON (wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id)
WHERE wp_term_taxonomy.term_id IN (307)
GROUP BY wp_posts.ID

Solo reemplaza 307 con el term_id de la categoría para la que deseas obtener resultados. Puedes encontrar esto buscando en la columna name de wp_terms y te devolverá el term_id asociado.

También puedes devolver múltiples categorías si lo deseas, solo sepáralas con comas en la cláusula WHERE, por ejemplo: WHERE wp_term_taxonomy.term_id IN (307, 450, 200, 99).

21 may 2017 22:58:11
Comentarios

El conocimiento de SQL siempre es una gran ventaja+

Tosin Onikute Tosin Onikute
20 may 2018 12:49:16
4

Esto se puede hacer usando la clase WP_Query. Si lo único que necesitas es obtener todas las publicaciones basadas en la categoría, puedes hacerlo usando el ID o el slug.

$args = array(
   'cat' => 1,
);

$new_query = new WP_Query( $args );

O

$args = array(
   'cat_name' => 'noticias',
);

$new_query = new WP_Query( $args );

A partir de ahí, escribes el loop como de costumbre con una excepción:

<?php if ( $new_query->have_posts() ) : ?>
   <?php while ( $new_query->have_posts() ) : $new_query->the_post(); ?>
      // Código de la publicación aquí
   <?php endwhile; ?>

   <?php wp_reset_postdata(); ?>

<?php else : ?>
    // No se encontraron publicaciones
<?php endif; ??

Debes incluir la llamada a la función wp_reset_postdata(); que restablecerá el valor de global $post; al de la consulta principal.

21 may 2017 22:16:32
Comentarios

¡Gracias! Aceptaré esta respuesta si no puedo encontrar una solución que no dependa del framework de WP. Quiero investigar un poco más sobre esto, pensarías que habría alguna forma de unir las tablas manualmente mediante una consulta... pero quizás no.

bbruman bbruman
21 may 2017 22:36:59

¿Con qué estás intentando acceder a esto si no es con WordPress?

Cedon Cedon
21 may 2017 22:38:05

Solo estoy exportando las tablas que necesito de WordPress, haciendo pruebas intensivas y experimentando con ellas en localhost. Principalmente para intentar editar masivamente la columna post_content y volverla a subir al entorno en vivo. Como post_content son simplemente bloques de código html, el framework no era necesario (hasta ahora, quizás).

bbruman bbruman
21 may 2017 22:43:30

Podrías usar la API REST potencialmente entonces.

Cedon Cedon
21 may 2017 23:21:25
1

Creé una consulta, puedes usar esta para encontrar todas las categorías relacionadas

SELECT *  FROM wpra_term_relationships 
INNER JOIN wpra_term_taxonomy ON (wpra_term_taxonomy.term_taxonomy_id=wpra_term_relationships.term_taxonomy_id AND wpra_term_taxonomy.taxonomy='category')
INNER JOIN wpra_terms ON (wpra_terms.term_id=wpra_term_taxonomy.term_id )
WHERE object_id='273960'

Solo reemplaza 273960 con tu ID de POST

2 jun 2019 04:19:47
Comentarios

Esta no es la respuesta a la pregunta. Se trataba de obtener publicaciones de una categoría específica (el título es un poco engañoso).

nmr nmr
2 jun 2019 14:12:14
0

¡Gracias, Deepak Sharma, con tu publicación puedo hacer lo que estaba intentando! Hice algunos ajustes para que funcione. Intenté dar like a tu comentario, pero no puedo porque no tengo suficientes puntos.

SELECT * FROM wp_term_relationships INNER JOIN wp_term_taxonomy ON (wp_term_taxonomy.term_taxonomy_id=wp_term_relationships.term_taxonomy_id AND wp_term_taxonomy.taxonomy='product_cat') INNER JOIN wp_terms ON (wp_terms.term_id=wp_term_taxonomy.term_id ) WHERE object_id='61170'
29 abr 2020 19:21:44