it-swarm.com.de

MySQL-Abfrage zum Abrufen der Kategorie von wp_posts

Mit dieser Abfrage können Sie alle meine Posts mit einem bestimmten post_type abrufen.

SELECT *
FROM wp_posts
WHERE post_type = 'product';

Wie beschrieben hier ist die Kategorie nicht in der wp_posts-Tabelle, sondern in den Termtabellen wp_termswp_term_relationshipswp_term_taxonomy

Beim Durchsuchen aller Tabellen nach einer bestimmten Kategorie konnte ich nur eine Kategorie in der Tabelle wp_terms finden, die die folgenden Spalten enthält

  • term_id
  • name
  • schnecke
  • term_group

Wenn Sie in anderen Tabellen nach Querverweisen suchen, die sie auf wp_posts zurückführen, kann dies zu Komplikationen führen.

Ich denke an term_id, nach dem ich suchen sollte, da es wie ein Fremdschlüssel aussieht, aber die einzige Instanz davon befindet sich in wp_term_taxonomy, und die einzige Information, die ich in der Tabelle finden kann, die sich auf meine Kategorie (oder besser term_id) bezieht, ist

  • term_taxonomy_id
  • term_id
  • taxonomie
  • beschreibung
  • elternteil
  • anzahl

Die einzige Information, die ich daraus erhalten kann, ist, mich darüber zu informieren, dass mein term_idtaxonomy ein product_cat ist, und in count zu sehen, wie viele Posts ich für diese bestimmte Kategorie habe.

Da ich ein wenig über MySQL weiß, weiß ich, ob es irgendeine Hoffnung gibt, dies zu tun. Ich muss meine Abfrage ändern und eine oder zwei JOIN ausführen.

Aber ich finde nur sehr begrenzte Informationen darüber, worauf ich mich genau einlassen kann.

Hier ist die Struktur von 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`)
 )

Ist es überhaupt möglich, meine Abfrage so zu ändern, dass nur wp_posts-Tabellenzeilen für bestimmte Kategorien abgerufen werden?

1
bbruman

Herausgefunden. @belinus ist wahrscheinlich die Lösung für Sie, wenn Sie dies in WordPress tun möchten.

Da es sich nur um eine unformatierte SQL-Abfrage handelt, mit der Sie herumspielen können, habe ich diese gefunden, ein wenig geändert und sie gibt alle Produkte für eine bestimmte Kategorie zurück.

Hierzu sind drei Tabellen erforderlich: wp_postswp_term_relationships und 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

Ersetzen Sie einfach 307 durch den term_id der Kategorie, für die Sie Ergebnisse erhalten möchten. Sie finden dies, indem Sie in der Spalte wp_termsname suchen und die zugehörige Term-ID zurückgeben.

Sie können auch mehrere Kategorien zurückgeben, indem Sie sie in der WHERE-Klausel durch Komma trennen, zum Beispiel WHERE wp_term_taxonomy.term_id IN (307, 450, 200, 99).

5
bbruman

Dies kann mit der Klasse WP_Query erfolgen. Wenn Sie nur nach allen Posts suchen, die auf der Kategorie basieren, können Sie dies mit der ID oder dem Slug tun.

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

$new_query = new W_Query( $args );

OR

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

$new_query = new W_Query( $args );

Von dort aus korrigieren Sie die Schleife wie gewohnt mit einer Ausnahme:

<?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; ??

Sie müssen den Funktionsaufruf wp_reset_postdata(); einfügen, der den globalen Wert von $ post auf den Wert der Hauptabfrage zurücksetzt.

1
Cedon