Interogare MySQL pentru a obține categoria din wp_posts

21 mai 2017, 20:57:48
Vizualizări: 24K
Voturi: 6

Folosind această interogare pentru a recupera toate postările mele cu un anumit post_type

SELECT *
FROM wp_posts
WHERE post_type = 'product';

După cum este descris aici categoria nu se află în tabelul wp_posts ci în tabelele de termeni wp_terms wp_term_relationships wp_term_taxonomy

Căutând prin toate tabelele pentru o categorie la care mă gândeam, singura instanță a unei categorii pe care am putut-o găsi a fost în tabelul wp_terms care conține următoarele coloane

  • term_id
  • name
  • slug
  • term_group

Căutarea referințelor încrucișate la acestea în alte tabele și cumva relaționarea lor înapoi la wp_posts prezintă unele complicații.

Gândirea mea este că ar trebui să caut term_id deoarece pare a fi o cheie străină, dar singura instanță a acesteia este în wp_term_taxonomy, și singura informație pe care o pot găsi în tabel legată de categoria mea (sau mai degrabă term_id) este

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

Așadar singura informație pe care o pot obține din aceasta îmi spune că term_id-ul meu taxonomy este un product_cat și în count îmi spune câte postări am pentru această categorie particulară.

Știind puțin despre MySQL, știu că dacă există vreo speranță de a face acest lucru trebuie să modific interogarea mea și să fac unul sau două JOIN-uri.

Dar găsesc informații foarte limitate despre ce anume pot conecta.

Iată structura tabelului 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`)
)

Este posibil să modific interogarea mea pentru a recupera doar rândurile din tabelul wp_posts pentru categorii specifice?

2
Comentarii

De ce ai nevoie să accesezi asta direct cu SQL când există clasa WP_Query care poate face asta pentru tine?

Cedon Cedon
21 mai 2017 21:44:02

Nu am auzit de asta. O să mă uit. Doar experimentez cu editarea în masă a post_content în tabelul wp_posts pe localhost, în propriul meu script PHP în afara WordPress. Apoi import înapoi pe site-ul live. A funcționat bine până când a trebuit să filtrez categorii.

bbruman bbruman
21 mai 2017 22:04:29
Toate răspunsurile la întrebare 4
1
15

Am rezolvat. @belinus este probabil soluția pentru tine dacă cauți să faci asta în WordPress.

În ceea ce privește o simplă interogare SQL cu care poți experimenta, am găsit aceasta, am modificat-o puțin și returnează toate produsele pentru o anumită categorie.

Sunt necesare trei tabele pentru asta wp_posts wp_term_relationships și 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

Doar înlocuiește 307 cu term_id-ul categoriei pentru care dorești să obții rezultate. Poți găsi acest lucru căutând în coloana name din wp_terms și va returna id-ul termenului asociat.

De asemenea, poți returna mai multe categorii dacă dorești, doar separă-le prin virgulă în clauza WHERE, de exemplu WHERE wp_term_taxonomy.term_id IN (307, 450, 200, 99).

21 mai 2017 22:58:11
Comentarii

Cunoștințele de SQL sunt întotdeauna un mare plus+

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

Aceasta poate fi realizată folosind clasa WP_Query. Dacă tot ce dorești este să obții toate articolele pe baza categoriei, poți face asta folosind ID-ul sau slug-ul.

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

$new_query = new WP_Query( $args );

SAU

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

$new_query = new WP_Query( $args );

De aici, scrii bucla în mod normal, cu o singură excepție:

<?php if ( $new_query->have_posts() ) : ?>
   <?php while ( $new_query->have_posts() ) : $new_query->the_post(); ?>
      // Codul articolului aici
   <?php endwhile; ?>

   <?php wp_reset_postdata(); ?>

<?php else : ?>
    // Niciun articol găsit
<?php endif; ?>

Este necesar să incluzi apelul funcției wp_reset_postdata(); care va reseta variabila globală $post; la valoarea principală a interogării.

21 mai 2017 22:16:32
Comentarii

Mulțumesc! Voi accepta acest răspuns dacă nu găsesc o soluție care să nu depindă de cadrul WP. Aș mai vrea să cercetez puțin - ai crede că ar exista vreo modalitate de a uni tabelele printr-o interogare manuală... dar poate nu.

bbruman bbruman
21 mai 2017 22:36:59

Cu ce încerci să accesezi asta dacă nu prin WordPress?

Cedon Cedon
21 mai 2017 22:38:05

Pur și simplu exportez tabelele de care am nevoie din WordPress, fac teste intensive și experimentez cu ele pe localhost. În principal pentru a încerca să editez în masă coloana post_content și să o readuc pe live. Deoarece post_content este pur și simplu blocuri de cod HTML, cadrul nu era necesar (până acum, poate).

bbruman bbruman
21 mai 2017 22:43:30

Ați putea folosi potențial API-ul REST atunci.

Cedon Cedon
21 mai 2017 23:21:25
1

Am creat o interogare, pe care o poți folosi pentru a găsi toate categoriile asociate

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'

Doar înlocuiește 273960 cu ID-ul tău de POST

2 iun. 2019 04:19:47
Comentarii

Acesta nu este răspunsul la întrebare. Era vorba despre obținerea postărilor dintr-o anumită categorie (titlul este puțin înșelător).

nmr nmr
2 iun. 2019 14:12:14
0

Mulțumesc, Deepak Sharma, cu articolul tău am reușit să fac ceea ce încercam! Am făcut câteva corecții pentru a funcționa. Am încercat să-ți las un like la comentariu, dar nu pot pentru că nu am suficiente puncte!

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