Query MySQL per Recuperare Categoria da wp_posts

21 mag 2017, 20:57:48
Visualizzazioni: 24K
Voti: 6

Utilizzo questa query per recuperare tutti i miei post con uno specifico post_type

SELECT *
FROM wp_posts
WHERE post_type = 'product';

Come descritto qui la categoria non si trova nella tabella wp_posts ma nelle tabelle dei termini wp_terms wp_term_relationships wp_term_taxonomy

Cercando in tutte le tabelle una categoria che avevo in mente, l'unica istanza di categoria che ho potuto trovare era nella tabella wp_terms che contiene le seguenti colonne

  • term_id
  • name
  • slug
  • term_group

Cercare riferimenti incrociati a questo in altre tabelle e in qualche modo collegarli a wp_posts sta creando alcune complicazioni.

Il mio ragionamento è che dovrei cercare il term_id poiché sembra una chiave esterna, ma l'unica istanza di questo è in wp_term_taxonomy, e le uniche informazioni che posso trovare nella tabella relative alla mia categoria (o meglio al term_id) sono

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

Quindi le uniche informazioni che posso ottenere da questo mi fanno sapere che la taxonomy del mio term_id è un product_cat e in count mi dice quanti post ho per questa particolare categoria.

Conoscendo un po' MySQL so che se c'è qualche speranza di farlo devo modificare la mia query e fare uno o due JOIN.

Ma sto trovando informazioni molto limitate su cosa esattamente posso agganciare.

Ecco la struttura di 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`)
 )

È possibile modificare la mia query per recuperare solo le righe della tabella wp_posts per categorie specifiche?

2
Commenti

Perché hai bisogno di accedervi direttamente con SQL quando c'è la classe WP_Query che può farlo per te?

Cedon Cedon
21 mag 2017 21:44:02

Non ne ho mai sentito parlare. Ci darò un'occhiata. Sto solo sperimentando con la modifica massiva del mio post_content nella tabella wp_posts sul mio localhost in uno script PHP esterno a WordPress. Poi lo reimporto sul mio sito live, una cosa del genere. Ha funzionato bene finché non ho avuto bisogno di filtrare le categorie

bbruman bbruman
21 mag 2017 22:04:29
Tutte le risposte alla domanda 4
1
15

Ho capito. @belinus è probabilmente la soluzione giusta per te se stai cercando di fare questo all'interno di WordPress.

Per quanto riguarda una semplice query SQL con cui puoi sperimentare, ho trovato questa, l'ho modificata leggermente e restituisce tutti i prodotti per una particolare categoria.

Sono necessarie tre tabelle per farlo wp_posts wp_term_relationships e 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

Basta sostituire 307 con il term_id della categoria per cui vuoi ottenere i risultati. Puoi trovarlo cercando nella colonna name della tabella wp_terms e restituirà l'ID del termine associato.

Puoi anche restituire più categorie se lo desideri, basta separarle con una virgola nella clausola WHERE, ad esempio WHERE wp_term_taxonomy.term_id IN (307, 450, 200, 99).

21 mag 2017 22:58:11
Commenti

La conoscenza di SQL è sempre un grande vantaggio+

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

Questo può essere fatto utilizzando la classe WP_Query. Se tutto ciò che vuoi fare è recuperare tutti i post basati sulla categoria, puoi farlo usando l'ID o lo slug.

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

$new_query = new WP_Query( $args );

OPPURE

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

$new_query = new WP_Query( $args );

Da qui puoi scrivere il loop normalmente con un'eccezione:

<?php if ( $new_query->have_posts() ) : ?>
   <?php while ( $new_query->have_posts() ) : $new_query->the_post(); ?>
      // Codice del Post qui
   <?php endwhile; ?>

   <?php wp_reset_postdata(); ?>

<?php else : ?>
    // Nessun Post Trovato
<?php endif; ?>

Devi includere la chiamata alla funzione wp_reset_postdata(); che reimposterà il global $post; al valore della query principale.

21 mag 2017 22:16:32
Commenti

Grazie! Accetterò questa risposta se non riesco a trovare una soluzione che non dipenda dal framework WP. Vorrei approfondire un po', penseresti che ci dovrebbe essere un modo per unire le tabelle manualmente con una query... ma forse no

bbruman bbruman
21 mag 2017 22:36:59

Con cosa stai cercando di accedervi se non con WordPress?

Cedon Cedon
21 mag 2017 22:38:05

Sto semplicemente esportando le tabelle di cui ho bisogno da WordPress, facendo dei test approfonditi e sperimentando con esse in locale. Principalmente per provare a modificare in blocco la colonna post_content e riportarla online. Dato che post_content è semplicemente composto da blocchi di codice html, il framework non era necessario (fino ad ora, forse).

bbruman bbruman
21 mag 2017 22:43:30

Potresti utilizzare l'API REST in questo caso.

Cedon Cedon
21 mag 2017 23:21:25
1

Ho creato una query, puoi usarla per trovare tutte le categorie correlate

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'

Basta sostituire 273960 con il tuo POST ID

2 giu 2019 04:19:47
Commenti

Questa non è la risposta alla domanda. Si trattava di ottenere post da una categoria specifica (il titolo è un po' fuorviante).

nmr nmr
2 giu 2019 14:12:14
0

Grazie, Deepak Sharma, con il tuo post ho potuto fare quello che stavo cercando di realizzare! Ho apportato alcune correzioni per farlo funzionare. Ho provato a mettere "mi piace" al tuo commento, ma non posso perché non ho abbastanza punti!

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 apr 2020 19:21:44