Consulta MySQL para Recuperar Categorías desde wp_posts
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?

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)
.

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.

¡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.

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).

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

¡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'
