Запрос MySQL для извлечения категории из сообщений wp


Используя этот запрос, чтобы получить все мои сообщения с определенным post_type

SELECT *
FROM wp_posts
WHERE post_type = 'product';

Как описано здесь категория находится не в таблице wp_posts, а в таблицах терминов wp_terms wp_term_relationships wp_term_taxonomy

Просматривая все таблицы в поисках категории, которую я имел в виду, единственный экземпляр категории, который я смог найти, был в таблице wp_terms, которая содержит следующее столбцы

  • идентификатор термина
  • имя
  • слизняк
  • терминогруппа

Поиск перекрестных ссылок на это в других таблицах и как-то связать их с wp_posts создает некоторые сложности.

Мое мышление таковоterm_id Я должен искать, поскольку это похоже на внешний ключ, но единственный экземпляр этого находится в wp_term_taxonomy, и единственная информация, которую я могу найти в таблице, относящаяся к моей категории (или, скорее, term_id) является

  • термин_таксономи_ид
  • идентификатор термина
  • таксономия
  • описание
  • родитель
  • количество

Таким образом, единственная информация, которую я могу получить из этого, - это сообщить мне, что мой term_id taxonomy является product_cat и в count сообщает мне, сколько у меня сообщений для этой конкретной категории.

Немного зная о MySQL, я знаю, есть ли какая-либо надежда сделать это, мне нужно изменить свой запрос и выполнить JOIN или два.

Но я всего лишь нахожу очень ограниченную информацию о том, за что именно я могу зацепиться.

Вот структура 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`)
 )

Возможно ли вообще изменить мой запрос, чтобы получать только строки таблицы wp_posts для определенных категорий?

Author: bbruman, 2017-05-21

4 answers

Понял это. @belinus, вероятно, является решением для вас, если вы хотите сделать это в WordPress.

Что касается простого необработанного SQL-запроса, с которым вы можете поиграть, я нашел этот, немного изменил его, и он возвращает все продукты для определенной категории.

Для этого требуется три таблицы wp_posts wp_term_relationships и 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

Просто замените 307 на term_id категории, для которой вы хотите получить результаты. Вы можете найти это по поиск в wp_terms name столбец, и он вернет связанный идентификатор термина.

Вы также можете вернуть несколько категорий, если хотите, просто разделите их запятой в предложении WHERE, например WHERE wp_term_taxonomy.term_id IN (307, 450, 200, 99).

 9
Author: bbruman, 2017-05-21 20:13:25

Это можно сделать с помощью класса WP_Query. Если все, что вам нужно, - это захватить все сообщения в зависимости от категории, вы можете сделать это с помощью идентификатора или слага.

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

$new_query = new WP_Query( $args );

ИЛИ

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

$new_query = new WP_Query( $args );

Оттуда вы записываете цикл как обычно, за одним исключением:

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

Вам необходимо включить вызов функции wp_reset_postdata();, который вернет значение global $post; обратно к значению основного запроса.

 1
Author: Cedon, 2019-04-01 10:20:44

Я создал запрос, вы можете использовать его, чтобы найти все категории, связанные с

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'

Просто замените 273960 своим ПОЧТОВЫМ идентификатором

 0
Author: Deepak Sharma, 2019-06-02 01:19:47

Спасибо, Дипак Шарма, с твоим постом я могу сделать то, что пытался сделать! Я кое-что исправил, чтобы это работало. Мне пытался понравиться ваш комментарий, но я не могу, потому что у меня недостаточно очков!

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'
 0
Author: ronaldoguedess, 2020-04-29 16:21:44