カニバリなど重複コンテンツがある場合に有効な「canonical」属性。
Cocoonではversion 1.9.0から記事編集画面で、記事ごとにcanonical URLを設定できるようになっています。
最初は設定する記事数も少なくて把握できたのですが、増えてくると探すのも面倒になってきました。
なので投稿一覧画面で検索条件に追加して、cacnonical URLを設定してある記事だけを検索できるようにカスタマイズしました。
いつかCocoonに標準搭載されるかもしれませんが、それまでの代用には十分かもしれません。
基本的にfunction.phpへ追記するだけでOKなはずです。
カスタマイズ結果
見た目的には、このあたりが変わっています。
- 表示オプションにcanonicalを追加
- 記事一覧にcanonicalを表示する列を追加
- 検索フィルターにチェックボックスを追加
表示オプションにcanonicalを追加
投稿一覧画面の表示オプションにcanonicalを表示するかのオプションを追加されます。
記事一覧にcanonicalを表示する列を追加
表示オプションにチェックをすると、記事一覧にcanonical URLが表示される列が追加されます。
検索フィルターにチェックボックスを追加
検索フィルターにcanonical URLが入力された記事だけヒットさせるチェックボックスを追加しました。
チェックしない場合はcanonicalが入力されている記事と入力されていない記事の両方とも検索されます。(普段どおりの検索になります。)
文字列検索も使えます。
function.phpに追加するコード
微々たるコード量なので、パフォーマンスには影響は少ないでしょうが念の為「is_admin()」で囲っているので一般ユーザーが見るときには影響ないと思います。
// <editor-fold desc="投稿一覧画面でcanonical設定されている投稿をフィルタリングする">
if (is_admin()) { // 管理画面のみメソッド追加する
// <editor-fold desc="一覧表示をカスタマイズ">
function manage_posts_columns_canonical($columns) {
// 一覧に追加する項目名
$columns['the_page_canonical_url'] = "canonical";
return $columns;
}
add_filter( 'manage_posts_columns', 'manage_posts_columns_canonical' );
add_filter( 'manage_pages_columns', 'manage_posts_columns_canonical' );
function add_column_canonical($column_name, $post_id) {
// カノニカルURL
if( $column_name === 'the_page_canonical_url' ) {
$canonical = nl2br(get_post_meta($post_id, 'the_page_canonical_url', true));
echo $canonical;
}
}
add_action( 'manage_posts_custom_column', 'add_column_canonical', 10, 2 );
add_action( 'manage_pages_custom_column', 'add_column_canonical', 10, 2 );
// </editor-fold>
// <editor-fold desc="SQL">
function custom_search_join_canonical($join){
if(!empty($_REQUEST['checkCanonicalUrl'])) {
$join .= " INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) ";
}
return $join;
}
add_filter( 'posts_join', 'custom_search_join_canonical' );
function custom_search_canonical($search, $wp_query ) {
//カスタムフィールドで検索
if (!empty($_REQUEST['checkCanonicalUrl'])) {
$search .= "
AND wp_postmeta.meta_key = 'the_page_canonical_url'
AND wp_postmeta.meta_value != ''";
}
return $search;
}
add_filter('posts_search','custom_search_canonical', 10, 2);
// </editor-fold>
// <editor-fold desc="検索項目に追加">
function add_canonical_url_filter(){
global $post_type;
if (($post_type === 'post') || ($post_type === 'page')) {
$checked = isset($_GET['checkCanonicalUrl']) ? ' checked="checked" ' : '';
echo '<label><input type="checkbox" name="checkCanonicalUrl" '.$checked.'> canonical</label>';
}
}
add_action('restrict_manage_posts', 'add_canonical_url_filter');
// </editor-fold>
}
// </editor-fold>
今回はcanonical URLを設定している記事しかチェックしていないですが、ソースコードが理解できるならチェックボックスをテキストボックスに置き換えてcanonical URLに対して文字列検索も簡単に実装できそうですね。
コメント