網頁

2006年1月19日 星期四

Wordpress Plugin: Category Visibility

前兩天在跟鹿人聊到 Wordpress 的 plugins 的時候,跑到 wordpress codexplugins 區看到 restriction 這分類裡好像有些符合我之前想要的需求,於是抓了 Category Visibility 這個 plugin 下來。他的簡介中說他能夠控制特定的 categories 要不要在 frontpage/rss feed/categoriez list/search result 中出現,甚至還能夠依據 user level 來做判斷。

和一般的 plugin 一樣,只要去這裡把他的原始檔抓下來,rename 成 .php 丟到 wordpress 的 plugin 目錄裡就可以使用了。不過好像一開始至少要去 Category Visibility 的地方勾一勾 submit 一次,因為他的 table 在那邊才會建立。

不幸的是我的 categories list 裝了他之後就爛掉了。剛剛花點時間找了一下發現,爛在兩個地方:

一個是他沒有處理好 nested categories,不會正確的把標籤給 close,在他 plugin 的 code 當中會看到原來 alter_vis_catlist 裡面有:

<?php
if (preg_match("/href/", $thelist)) {
$newlist = "";
$children = 0;
$linklist = preg_split('/\t/', $thelist);
foreach ($linklist as $link) {
if(preg_match("/class.*children/", $link)) {
//$children = 1;
$children += 1; // fix nested cat
$newlist .= $link;
} elseif(preg_match("//", $link) && $children) {
//$children = 0;
$children -= 1; // fix nested cat
$newlist .= $link;
} else {
$thiscatname = strip_tags($link);
$thiscatname = preg_replace("/\s+\(\d+\)\s+/", "", $thiscatname);
$thiscatname = trim($thiscatname);
if(!empty($thiscatname)) {
$cats = $wpdb->get_results("SELECT cat_ID from $wpdb->categories WHERE cat_name='$thiscatname' LIMIT 1");
if ($cats) {
foreach ($cats as $cat) {
$thiscat = $cat->cat_ID;
}
if($wpdb->query("SELECT cat_ID FROM $cat_visibility WHERE cat_ID=$thiscat AND list=1 AND user_level

照上面的方式修改一般人應該就沒有問題了。可是因為我還有手動改讓分類顯示成 category 的 description ,所以底下這段得修改:
get_results("SELECT cat_ID from $wpdb->categories WHERE cat_name='$thiscatname' LIMIT 1"); ?>
把他改成

get_results("SELECT cat_ID from $wpdb->categories WHERE category_description='$thiscatname' LIMIT 1"); ?>
就正常了。