it-swarm-vi.tech

Truy vấn MySQL để truy xuất danh mục từ wp_posts

Sử dụng truy vấn này để truy xuất tất cả các bài đăng của tôi với một post_type cụ thể

SELECT *
FROM wp_posts
WHERE post_type = 'product';

Như được mô tả ở đây danh mục không nằm trong bảng wp_posts mà trong các bảng thuật ngữ wp_termswp_term_relationshipswp_term_taxonomy

Tìm kiếm trong tất cả các bảng cho một danh mục mà tôi có trong tâm trí, trường hợp duy nhất của danh mục tôi có thể tìm thấy là trong bảng wp_terms chứa các cột sau

  • hạn_id
  • tên
  • sên
  • thuật ngữ

Tìm kiếm các tham chiếu chéo cho điều này trong các bảng khác và bằng cách nào đó liên quan chúng trở lại wp_posts đang đặt ra một số phức tạp.

Suy nghĩ của tôi là term_id Tôi nên tìm kiếm vì nó giống như khóa ngoại, nhưng trường hợp duy nhất là trong wp_term_taxonomy, và thông tin duy nhất tôi có thể tìm thấy trong bảng liên quan đến danh mục của mình (hay đúng hơn là term_id) là

  • term_taxonomy_id
  • hạn_id
  • phân loại học
  • sự miêu tả
  • cha mẹ
  • đếm

Vì vậy, thông tin duy nhất tôi có thể nhận được từ điều này là cho tôi biết rằng term_idtaxonomy của tôi là một product_cat và trong count cho tôi biết tôi có bao nhiêu bài đăng cho danh mục cụ thể này.

Biết một chút về MySQL Tôi biết nếu có bất kỳ hy vọng nào để làm điều này, tôi cần sửa đổi truy vấn của mình và thực hiện JOIN hoặc hai.

Nhưng tôi chỉ tìm thấy thông tin rất hạn chế về chính xác những gì tôi có thể bám vào.

Đây là cấu trúc của 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`)
 )

Thậm chí có thể sửa đổi truy vấn của tôi để chỉ truy xuất các hàng của bảng wp_posts cho các danh mục cụ thể không?

1
bbruman

Tìm ra. @belinus có lẽ là giải pháp cho bạn nếu bạn đang muốn làm điều này trong WordPress.

Đối với chỉ một truy vấn SQL thô mà bạn có thể chơi xung quanh, tôi đã tìm thấy truy vấn này, đã sửa đổi nó một chút và nó trả về tất cả các sản phẩm cho một danh mục cụ thể.

Có ba bảng cần thiết để làm điều này wp_postswp_term_relationshipswp_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

Chỉ cần thay thế 307 bằng term_id của danh mục bạn đang tìm kiếm để có kết quả. Bạn có thể tìm thấy điều này bằng cách tìm kiếm trong cột wp_termsname và nó sẽ trả về id thuật ngữ được liên kết.

Bạn cũng có thể trả về nhiều danh mục nếu bạn muốn, chỉ cần dấu phẩy ngăn cách chúng trong mệnh đề WHERE, ví dụ WHERE wp_term_taxonomy.term_id IN (307, 450, 200, 99).

5
bbruman

Điều này có thể được thực hiện bằng cách sử dụng lớp WP_Query. Nếu tất cả những gì bạn đang tìm kiếm là lấy tất cả các bài đăng dựa trên danh mục, bạn có thể làm điều đó bằng cách sử dụng ID hoặc sên.

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

$new_query = new W_Query( $args );

OR

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

$new_query = new W_Query( $args );

Từ đó bạn đúng vòng lặp như bình thường với một ngoại lệ:

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

Bạn cần bao gồm lệnh gọi hàm wp_reset_postdata(); sẽ đặt lại bài đăng toàn cầu $ trở lại giá trị của truy vấn chính.

1
Cedon