WordPress でカテゴリのリンクを変更する

WordPress でカテゴリのリンクを標準以外に変更する方法です。
まぁ、それ専用のプラグインとかも探せば有ると思うんですが

http://example.com/?cid=xx 形式に変更する

例えば、カテゴリのリンクを http://example.com/?cid=xx とかって形式でも表示できるようにするには、以下のようにして parse_query フィルタを使うと良いです。
# functions.php とかに追加してやってください。

class add_category_link_to_different_link {
	function __construct(){
		add_filter('query_vars', array(&$this, 'add_query_vars'));
		add_action('parse_query', array(&$this, 'parse_query'));
	}
	public function add_query_vars($qvars) {
		$qvars[] = 'cid';
		return $qvars;
	}
	public function parse_query($query) {
		$cat_id  = (int) $query->query_vars['cid'];
		if ( !(empty($cat_id) || $cat_id === 0) ) {
			$url = get_category_link($cat_id);
			if ( !empty($url) && $url !== FALSE ) {
				$query->query_vars["cat"] = $cat_id;
				$query->is_404 = false;
			} else {
				$query->set_404();
			}
		}
		return $query;
	}
}
new add_category_link_to_different_link;

http://example.com/cid/xx 形式に変更する

カテゴリのリンクを http://example.com/cid/xx って形式に変更したい場合は、以下のようにして rewrite_rules を変更する必要があります。

class add_rewrite_rules{
    private $rule = null;
    private $query_var = null;
    function __construct($rule, $query_var) {
        $this->rule = $rule;
        $this->query_var = $query_var;
        add_filter('rewrite_rules_array', array(&$this, 'rewrite_rules_array'));
        add_action('init', array(&$this, 'init'));
    }
    public function init() {
        global $wp_rewrite;
        $rules = $wp_rewrite->wp_rewrite_rules();
        if (!isset($rules[$this->rule])) {
            $wp_rewrite->flush_rules();
        }
    }
    public function rewrite_rules_array($rules) {
        global $wp_rewrite;
        $new_rules[$this->rule] = $this->query_var;
        $rules = array_merge($new_rules, $rules);
        return $rules;
    }
}
global $wp_rewrite;
new add_rewrite_rules('^cid\/([0-9]+)$', $wp_rewrite->index . '?cat=$matches[1]');

via. firegoby » Blog Archive » WordPressのプラグインで任意のURLのページを追加する

get_category_link() テンプレートタグが返すリンクを変更する

ただし、これだけだとテンプレートタグの <?php get_category_link() > が返すリンクは変更されません。
ここも手当てしてやるには、さらにこんな感じで term_link フィルタもフックしてあげましょう。

function my_term_link($termlink, $term, $taxonomy) {
	return ($taxonomy === 'category' ? home_url('/?cid='. $term->term_id) : $termlink);
}
add_filter('term_link', 'my_term_link', 10, 3);

おまけ – 記事のパーマリンクを http://example.com/?eid=xx 形式に変更する

ちなみに記事のパーマリンクを http://example.com/?eid=xx 形式に変更したい場合は、以下のようにして parse_query フィルタを使うと良いです。

class add_permalink_to_different_link {
	function __construct(){
		add_filter('query_vars', array(&$this, 'add_query_vars'));
		add_action('parse_query', array(&$this, 'parse_query'));
	}
	public function add_query_vars($qvars) {
		$qvars[] = 'eid';
		return $qvars;
	}
	public function parse_query($query) {
		$post_id = (int) $query->query_vars['eid'];
		if ( !(empty($post_id) || $post_id === 0) ) {
			$url = get_permalink($post_id);
			if ( !empty($url) && $url !== FALSE ) {
				$query->query_vars["p"] = $post_id;
				$query->query["p"] = $post_id;
				$query->is_single = true;
				$query->is_singular = true;
				$query->is_home = false;
				$query->is_404 = false;
			} else {
				$query->set_404();
			}
		}
		return $query;
	}
}
new add_permalink_to_different_link;

この場合もテンプレートタグの <?php get_permalink() > が返すリンクは変更されません。
こんな感じで post_link フィルタをフックしてあげましょう。

function my_post_link($permalink, $post, $leavename) {
	return ($post->post_type === 'post' ? home_url('/?eid='.$post->ID) : $permalink);
}
add_filter('post_link', 'my_post_link', 10, 3);

誰得だかわからない記事ですが、参考にしてやってください!

コメントを残す

メールアドレスが公開されることはありません。