Query MySQL per Recuperare Categoria da wp_posts
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?
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)
.

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.

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

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

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

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'
