ワードプレス 投稿に関係するカテゴリ・タグをSQLで取得するには?

ショコラ
ショコラ

ワードプレス 投稿に関係するカテゴリ・タグをSQLで取得するには?

投稿情報は wp_posts 。カテゴリ、タグのマスターは wp_terms
カテゴリ、タグの構造をもっているのが wp_term_taxonomy
投稿情報とカテゴリ、タグを結び付けるのは wp_term_relationships (こちら↑一旦、上のwp_term_taxonomy を結合しなければなりません)。

なので投稿に紐づくカテゴリ、タグIDを取得するには以下のようにする。
①SELECT term_taxonomy_id FROM wp_term_relationships WHERE object_id={投稿ID}
②SELECT term_id FROM wp_term_taxonomy WHERE term_taxonomy_id in ({term_taxonomy_id })

もっさん先輩
もっさん先輩

投稿に関係する情報を取得する。

SELECT
  p.ID,
  p.post_type,
  p.post_name,
  x.taxonomy,
  x.parent,
  x.count,
  t.term_id,
  t.name
FROM
  wp_posts p
  LEFT JOIN wp_term_relationships r ON p.ID = r.object_id
  LEFT JOIN wp_term_taxonomy      x ON r.term_taxonomy_id = x.term_taxonomy_id
  LEFT JOIN wp_terms              t ON x.term_id = t.term_id
WHERE
  p.ID='1';

投稿に関係する カテゴリID を取得する。

SELECT
  t.term_id
FROM
  wp_posts p
  LEFT JOIN wp_term_relationships r ON p.ID = r.object_id
  LEFT JOIN wp_term_taxonomy      x ON r.term_taxonomy_id = x.term_taxonomy_id
  LEFT JOIN wp_terms              t ON x.term_id = t.term_id
WHERE
  p.ID='1'
  and x.taxonomy='category';

投稿に関係する タグID を取得する。

SELECT
  t.term_id
FROM
  wp_posts p
  LEFT JOIN wp_term_relationships r ON p.ID = r.object_id
  LEFT JOIN wp_term_taxonomy      x ON r.term_taxonomy_id = x.term_taxonomy_id
  LEFT JOIN wp_terms              t ON x.term_id = t.term_id
WHERE
  p.ID='1'
  and x.taxonomy='post_tag';

公開されている投稿に、post-grid を追加するSQLを作成するプログラム

<?php
//
// 公開されている投稿に、post-grid を追加するSQLを作成するプログラム
//
$dsn = 'mysql:host={ホスト};port=3306;dbname={データベース名}';
$user = '{ユーザー名}';
$password = '{パスワード}';
$pdo = new PDO($dsn,$user,$password);
$stm = $pdo->prepare("SELECT * FROM wp_posts WHERE post_status='publish'");
$stm->execute();
while (false !== ($wp_post = $stm->fetch(PDO::FETCH_ASSOC))) {
  $post_id = $wp_post['ID'];

  // 既に post-grid があるなら処理しない。
  $post_content = $wp_post['post_content'];
  if (mb_ereg('wp:uagb/post-grid',$post_content)) {
    continue;
  }

  // タグID を取得する。
  $sql =<<< SQL
    SELECT
      t.term_id
    FROM
      wp_posts p
      LEFT JOIN wp_term_relationships r ON p.ID = r.object_id
      LEFT JOIN wp_term_taxonomy      x ON r.term_taxonomy_id = x.term_taxonomy_id
      LEFT JOIN wp_terms              t ON x.term_id = t.term_id
    WHERE
      p.ID='{$post_id}'
      AND x.taxonomy='post_tag';
    SQL;
  $wp_term = $pdo->query($sql)->fetch(PDO::FETCH_ASSOC);
  if (false !== $wp_term) {
    $post_grid =<<< POSTGRID
      <!-- wp:uagb/post-grid {"block_id":"ad9b2fc5","categories":"{$wp_term['term_id']}","taxonomyType":"post_tag"} /-->
      POSTGRID;
    echo "UPDATE wp_posts SET post_content=CONCAT(post_content,'{$post_grid}') WHERE ID={$post_id};",PHP_EOL;
  }
}

以上

Scroll to Top