WordPress: rel=”canonical” を追加する「wp-canonical mod by hide10」プラグイン

plug-in,WordPress

複数の類似した内容のページの中で、優先されるページを示すメタタグ「rel="canonical"」を追加するプラグインを公開します。

ダウンロード

このプラグインは、「wp-canonical」として公開されていたプラグインを、当ブログのURL形式にあうよう修正を加えたものです。

他のURL形式を持つブログでは、生成されるcanonical URLが適切ではない場合があるので注意してください。

ダウンロード: wp-canonical mod by hide10

元ファイル

修正元となった wp-canonical も置いときます。

元となったプラグイン「wp-canonical」は、「All in One SEO Pack」にソースマージされています。

もしあなたがAll in One SEO Packを使っているなら、このプラグインを使う必要はありません。

ダウンロード: wp-canonical.zip

ソース

以下、wp-canonical mod by hide10のソースです。

<?php
/*
Plugin Name: Canonical URL's mod by hide10
Version: 0.2
Plugin URI: https://www.hide10.com/archives/17148
Description: Adds rel="canonical" links to the head of your site.
Author: KOBAYASHI Hideto
Author URI: https://www.hide10.com/

Copyright 2012 KOBAYASHI Hideto (email: hide10@hide10.com)

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/

function yoast_get_paged($link) {
    $page = get_query_var('paged');
    if ($page && $page > 1) {
        $link = trailingslashit($link) ."page/". "$page";
    }
    return $link;
}

function yoast_guess_url($query) {
    if ($query->is_404 || $query->is_search) {
        return false;
    }
    $haspost = count($query->posts) > 0;
    $has_ut = function_exists('user_trailingslashit');

    // Copied entirely and slightly modified from Scott Yang's Permalink Redirect, http://svn.fucoder.com/fucoder/permalink-redirect/
    if (get_query_var('m')) {
        $m = preg_replace('/[^0-9]/', '', get_query_var('m'));
        switch (strlen($m)) {
            case 4: // Yearly
                $link = get_year_link($m);
                break;
            case 6: // Monthly
                $link = get_month_link(substr($m, 0, 4), substr($m, 4, 2));
                break;
            case 8: // Daily
                $link = get_day_link(substr($m, 0, 4), substr($m, 4, 2),
                                     substr($m, 6, 2));
                break;
            default:
                return false;
        }
    } elseif ($query->is_author && $haspost) {
        global $wp_version;
        if ($wp_version >= '2') {
            $author = get_userdata(get_query_var('author'));
            if ($author === false)
                return false;
            $link = get_author_link(false, $author->ID,
                $author->user_nicename);
        } else {
            // XXX: get_author_link() bug in WP 1.5.1.2
            //      s/author_nicename/user_nicename/
            global $cache_userdata;
            $userid = get_query_var('author');
            $link = get_author_link(false, $userid,
                $cache_userdata[$userid]->user_nicename);
        }
    } elseif ($query->is_category && $haspost) {
        $link = get_category_link(get_query_var('cat'));
        $link = yoast_get_paged($link);
    } else if ($query->is_tag  && $haspost) {
        $tag = get_term_by('slug',get_query_var('tag'),'post_tag');
        if (!empty($tag->term_id)) {
            $link = get_tag_link($tag->term_id);
        } 
        $link = yoast_get_paged($link);
    } elseif ($query->is_day && $haspost) {
        $link = get_day_link(get_query_var('year'),
                             get_query_var('monthnum'),
                             get_query_var('day'));
    } elseif ($query->is_month && $haspost) {
        $link = get_month_link(get_query_var('year'),
                               get_query_var('monthnum'));
    } elseif ($query->is_year && $haspost) {
        $link = get_year_link(get_query_var('year'));
    } elseif ($query->is_home) {
        if ((get_option('show_on_front') == 'page') &&
            ($pageid = get_option('page_for_posts'))) {
            $link = get_permalink($pageid);
            $link = yoast_get_paged($link);
            $link = trailingslashit($link);
        } else {
            if ( function_exists( 'icl_get_home_url' ) ) {
                $link = icl_get_home_url();
            } else {
                $link = get_option( 'home' );
            }
            $link = yoast_get_paged($link);
        }
    } elseif ($query->is_tax && $haspost ) {
            $taxonomy = get_query_var( 'taxonomy' );
            $term = get_query_var( 'term' );
            $link = get_term_link( $term, $taxonomy );
            $link = yoast_get_paged( $link );
    } elseif ( $query->is_archive && function_exists( 'get_post_type_archive_link' ) && ( $post_type = get_query_var( 'post_type' ) ) ) {
            $link = get_post_type_archive_link( $post_type );
            $link = yoast_get_paged( $link );
    } else {
        return false;
    }
    return $link;
}

function yoast_canonical_link() {
    global $wp_query;
    $url = yoast_guess_url($wp_query);
    if ($url) {
        echo "\n\t".'<link rel="canonical" href="'.$url.'"/>'."\n";
    }
}

add_action('wp_head','yoast_canonical_link',10,1);
?>

そんな感じで!