Customizable Post Listings を WordPress 2.3 系統で使用する

2008年4月1日

WordPress 2.3 以降対応の Ver3.0が公開!

coffee2code.com » Customizable Post Listings にて、ついに WordPress 2.3 以降に対応した Customizable Post Listings が公開されました。

以下用済みの記述

カテゴリを指定して最近の投稿やコメントのリストを生成できるプラグイン、Customizable Post Listings は大変便利なのですが、WordPress 2.3 でカテゴリを指定しようとすると、

WordPress database error Table '***.wp_post2cat’ doesn’t ex
ist for query SELECT DISTINCT * FROM wp_posts LEFT JOIN wp_post2cat ON (wp_posts.ID = wp_post2cat.post_id) AND ( category_id
= 13) WHERE wp_posts.post_date <= '2008-01-18 12:33:51' AND ( wp_posts.post_status = 'publish' ) AND wp_posts.post_password = '' GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 10[/code] のようなエラーが出ます。これは、power source* » WP2.3: データベース変更点の確認 にあるように、 wp_post2catがなくなってしまったせいなのですね。WordPress2.3で動作しないプラグインのリスト | コリス にもしっかり載っていますし。

けれども、これが使えないと不便な場合も多いので、なんとかできないか調べてみました。

WordPress 公式サイトの WordPress › Customizable Post Listings « WordPress Plugins で配布されている最新バージョンは、1.5 ですが、Scott Reilly 氏のサイトで配布されている1.1に対するパッチが見つかりました。

(追記)該当の記事の少し後に、SQL 構文が間違っているというツッコミ があったので、それを反映して、パッチ、ダウンロードファイルを置き換えてあります。

パッチ

$ diff -u customizable-post-listings.php.org customizable-post-listings.php
— customizable-post-listings.php.org 2004-09-27 13:50:33.000000000 +0900
+++ customizable-post-listings.php 2008-01-18 13:32:27.000000000 +0900
@@ -39,10 +39,13 @@
$authors = ", // space separated list of author IDs — leave empty to get all
$include_passworded_posts = false)
{
– global $wpdb, $tablecomments, $tableposts, $tablepost2cat;
+ global $wpdb, $tablecomments, $tableposts, $tableterm_relationships, $tableterm_taxonomy;
if ($add_recent_comment_to_sql && !isset($tablecomments)) $tablecomments = $wpdb->comments;
– if (!isset($tablepost2cat)) $tablepost2cat = $wpdb->post2cat;
+ if ($add_recent_comment_to_sql && !isset($tablecomments)) $tablecomments = $wpdb->comments;
+ if (!isset($tableterm_relationships)) $tableterm_relationships = $wpdb->term_relationships;
+ if (!isset($tableterm_taxonomy)) $tableterm_taxonomy = $wpdb->term_taxonomy;
if (!isset($tableposts)) $tableposts = $wpdb->posts;
+
if ($order != 'ASC’) $order = 'DESC’;
if ('max_comment_date’ == $orderby) { $add_recent_comment_to_sql = 1; }
else {
@@ -55,7 +58,7 @@
if ($add_recent_comment_to_sql) $sql = “SELECT $tableposts.*, MAX(comment_date) AS max_comment_date FROM $tablecomments, $tableposts “;
else $sql = “SELECT DISTINCT * FROM $tableposts “;
if ($categories) {
– $sql .= “LEFT JOIN $tablepost2cat ON ($tableposts.ID = $tablepost2cat.post_id) “;
+ $sql .= “LEFT JOIN $tableterm_relationships ON ($tableposts.ID = $tableterm_relationships.object_id) LEFT JOIN $tableterm_taxonomy ON ($tableterm_relationships.term_taxonomy_id = $tableterm_taxonomy.term_taxonomy_id)";
$cats = explode(' ', $categories);
}
$sql .= “WHERE $tableposts.post_date <= '$now' AND ( $tableposts.post_status = 'publish' "; @@ -69,7 +72,7 @@ foreach ($cats as $cat) { if ($first) $first = 0; else $sql .= "OR "; - $sql .= "$tablepost2cat.category_id = '$cat' "; + $sql .= "$tableterm_relationships.term_taxonomy_id = '$cat' "; } $sql .= ") "; } [/code]

使い方

Customizable Post Listings:Functions にある使い方がそのまま適用されますが、$categories で指定するのは、カテゴリー ID ではなく、WordPress 2.3 で新設された、wp_term_taxonomy テーブルの term_taxonomy_id を指定します。簡単にこの値を調べる方法はないので、管理画面で確認できるようにしました。併せてこちらのパッチも適用すると、使いやすくなるかと。

ダウンロード

簡単なパッチですが、適応済みの 1.1 のファイルをアップロードしておきます。当方の環境では動いていますが、ご利用の際はテスト環境などで動作確認の上、お使い下さい。

  • [download#8]
    Update:2008/01/18