web-dev-qa-db-fra.com

Requête MySQL pour récupérer la catégorie de wp_posts

Utiliser cette requête pour récupérer toutes mes publications avec un post_type spécifique

SELECT *
FROM wp_posts
WHERE post_type = 'product';

Comme décrit ici la catégorie ne figure pas dans la table wp_posts mais dans les tables de termes wp_termswp_term_relationshipswp_term_taxonomy

En cherchant dans toutes les tables une catégorie que j'avais en tête, la seule instance d'une catégorie que j'ai pu trouver était dans la table wp_terms qui contient les colonnes suivantes

  • term_id
  • prénom
  • limace
  • term_group

Rechercher des références croisées à cela dans d'autres tableaux et les relier d'une manière ou d'une autre à wp_posts pose certaines complications.

Ma pensée est term_id Je devrais chercher car cela ressemble à une clé étrangère, mais la seule instance de ce type est dans wp_term_taxonomy, et la seule information que je peux trouver dans le tableau relatif à ma catégorie (ou plutôt term_id) est

  • term_taxonomy_id
  • term_id
  • taxonomie
  • la description
  • parent
  • compter

Ainsi, la seule information que je puisse obtenir de ceci est de me faire savoir que mon term_idtaxonomy est un product_cat et dans count il me dit combien de posts j'ai pour cette catégorie particulière.

Connaissant un peu MySQL, je sais que s'il y a un espoir de le faire, j'ai besoin de modifier ma requête et de faire une JOIN ou deux.

Mais je ne trouve que des informations très limitées sur ce sur quoi je peux me tenir.

Voici la structure 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`)
 )

Est-il même possible de modifier ma requête pour ne récupérer que les lignes de la table wp_posts pour des catégories spécifiques?

1
bbruman

Deviner. @belinus est probablement la solution pour vous si vous cherchez à le faire dans WordPress.

En ce qui concerne une requête SQL brute avec laquelle vous pouvez jouer, j'ai trouvé celle-ci, je l'ai modifiée un peu et elle renvoie tous les produits d'une catégorie particulière.

Il y a trois tables requises pour faire ceci wp_postswp_term_relationships et 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

Il suffit de remplacer 307 par le term_id de la catégorie pour laquelle vous souhaitez obtenir des résultats. Vous pouvez le trouver en cherchant dans la colonne wp_termsname. Le terme id associé sera alors renvoyé.

Vous pouvez également renvoyer plusieurs catégories si vous le souhaitez. Il suffit de les séparer par une virgule dans la clause WHERE, par exemple WHERE wp_term_taxonomy.term_id IN (307, 450, 200, 99).

5
bbruman

Cela peut être fait en utilisant la classe WP_Query. Si tout ce que vous cherchez, c'est de saisir tous les articles en fonction de la catégorie, vous pouvez le faire en utilisant l'ID ou le slug.

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

$new_query = new W_Query( $args );

OR

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

$new_query = new W_Query( $args );

À partir de là, vous avez terminé la boucle normalement, à une exception près:

<?php if ( $new_query->have_posts() ) : ?>
   <?php while ( $new_query->have_posts() ) : $new_query->the_post(); ?>
      // Post Code Goes Here
   <?php endwhile; ?>

   <?php wp_reset_postdata(); ?>

<?php else : ?>
    // No Posts Found
<?php endif; ??

Vous devez inclure l'appel de la fonction wp_reset_postdata(); qui réinitialisera le $ post global à la valeur de la requête principale.

1
Cedon