Archive for the Category »WordPress Tips «

カテゴリー/アーカイブ・リストが404エラーに

普段自分のサイトをカテゴリー/アーカイブ・リスト表示で見ることは殆ど無いので、気付いたのが今日だったというだけで、どのタイミングからだったのかは判然としません。
ウェブ上を調べて同様のトラブルに遭遇した人の(但し多くない)情報では WordPress を3.1にアップデートしたタイミングで発生したトラブル(バグ?)だったみたいではありますが。

症状:カテゴリー/アーカイブ・リストで表示させるとが404エラーになる。
「Top Level Categories」または「WP No Category Base」プラグインを使用し、かつ、パーマリンク構造を「/%category%/%postname%」にしていると発生する。
「Top Level Categories」または「WP No Category Base」プラグインを使用しているとパーマリンク構造を他のフォーマットに変更しても、カテゴリー・リスト表示時に404エラーになる場合が(一部)発生する。
(多分ではあるが、 WordPress をVer.3.1 にする以前に作成していたカテゴリーでは発生してなさそうなので、3.1 以降でスラッグ or タクソノミー作成時での内部変換機序が変更になったのが原因しているではないか?と推測)

上記プラグインを停止すれば、症状は消えるが、同プラグインを使っている人は、ほぼ間違いなくパーマリンクに「余分に /category と挟まる」のを避けたい人だろうから、、、で私も同じくで、、、。

そこで調べてみたら「WP No Category Base – WPML compatible」という同様の機能のプラグインで Ver.3.1 以降に対応してそうなものを見付けて、動作確認したら無問題だったので報告しておきます。

確認環境:WordPress 3.3.1

注:当たり前の話ですが、同プラグインをインストールする前に、「Top Level Categories」「WP No Category Base」は停止しておかないとコンフリクトしてActivateに失敗します。念のため。
[amazonjs asin=”4839935416″ locale=”JP” title=”WordPress 3 サイト構築スタイルブック”]

2012年3月31日午後6時39分加筆訂正:
『「Top Level Categories」「WP No Category Base」プラグインを使用し』を『「Top Level Categories」または「WP No Category Base」プラグインを使用し』に訂正。

表示記事と同一カテゴリーの記事一覧をサイドバー表示するウィジェット

タイトルの通りで、何らかのページを表示させた状態の時に「その記事と同一のカテゴリー」「内に所属する記事」を「サイドバーに一覧表示」してくれる、そして「そのページがカテゴリーに属さない場合(固定ページとか)にウィジェットは非表示になる」ウィジェットは無いものかと探していたら見付かりました。
見つけ出すのに、検索キーワードを色々と工夫してやっと見付けたという感じで結構苦労したので、同じように探していて見付からなくて困っている方は居ると思いますので紹介しておきます。

重複になりますが機能は以下の通り。

  1. 表示されているページがカテゴリーに属している場合
  2. 同じカテゴリーに属している記事の一覧を作成し
  3. サイドバーに表示してくれる
  4. 同じカテゴリーに属した記事が無い場合、または表示ページがカテゴリーに属していない場合(固定ページなど)は非表示になる。
    (余分な空の要素が表示されて間抜けな感じになるのを防いでくれます)

※ Custom Post Type に対してどういう動作になるかは未検証なのでわかりません。興味あるので検証された方はご一報下さると非常に嬉しいです。

ダウンロード

配布サイト:Widgets of Posts by Same Categories
配布サイトは、英語です。
2011年9月22日現在のバージョン:Widgets of Posts by Same Categories 1.0.2
必要なワードプレスのバージョン:3.0.1以上
WordPressのバージョン2.8で導入された WP_Widget クラス を使用している。
zipファイルを解凍すると、「widgets-of-posts-by-same-categories」というフォルダが出てくる。

インストール

「widgets-of-posts-by-same-categories」フォルダを、フォルダごと、wp-content/plugins/ フォルダにアップロード・設置。
管理パネルで、「プラグイン」をクリックし、プラグイン設定画面を開く。「 Widgets of Posts by Same Categories 」を探し有効化。
管理画面内 posts-by-same-categories 項目
※ WordPress のプラグイン・アーカイブに登録されているので プラグイン → 新規追加 → 「Widgets of Posts by Same Categories」で検索 → インストール → 有効化 の方が簡単です。 WordPress の自動インストール機能が使えないサーバを利用の方は手動でインストールして下さい。

使用方法


WordPress管理画面ウィジェット欄

管理パネルの「外観」の横の▽をクリック。「ウィジェット」をクリックし、ウィジェット設定画面を表示。表示させたいウィジェットエリアへ、「Posts by Same Categories」をドラッグ&ドロップ。

下の画像が、「 Posts by Same Categories 」ウィジェット。
ウィジェット追加画面の様子


widgets-of-posts-by-same-categories-settings.gif

使用方法

表示投稿記事数
表示する投稿記事数を設定。
設定しない場合は、「 5 」が適用される。
並び順
投稿記事タイトル、投稿記事作成日、投稿記事更新日、投稿記事ID、ランダムから選択。
昇順/降順
昇順か、降順を選択。
カテゴリのリンク
タイトルとして表示されるカテゴリ名(記事ではなく)にリンクを張るかどうか。
除外(カテゴリ)
除外したいカテゴリがあれば、除外したいカテゴリのIDを、カンマ区切りで記入する。
区切り文字
カテゴリの親子間の区切り文字。


HTMLタイトルを階層構造(パンくずリスト)と一致させる

元ネタはこちら ↓

WebTecNote – [wp] ページタイトルとパンくずリンクを統一する
http://tenderfeel.xsrv.jp/wordpress/816/

パンくずリストを表示させ、かつ、ブラウザに表示されるタイトル(HTMLの title 部分)もこれと一致させる方法です。
以下をテーマのテンプレート「header.php」の当該箇所に記載。

<title>< ?php print($GLOBALS&#91;'local_head_title'&#93;); ?>< ?php bloginfo('name'); ?></title>

以下をテーマのテンプレート(表示させたい場所に合わせて任意。通常の感覚では「header.php」の下の方)に記述。
ソースを見て貰えれば分かる通り、HTMLタグも一緒に出力しているのでこのままでO.K.。
または後述のソース内のHTMLの箇所をご自身の用途に合わせて修正して下さい(僕は p を span に変えました。この辺は好みで)。

< ?php breadcrumb();?>

テーマの functions.php に以下の二つのソースを記述(但し、<?php と ?> に挟まれた任意の場所に。他のコードの途中に誤って記述してぶった切ってしまわないように、ソースはよく読んで。動かなくなります笑)

$local_body_id = null;
$local_page_title = null;
$local_category = null;
$local_head_title = null;
$local_category_title = null;</p>
<p>function set_page_title(){
    global $local_body_id, $local_page_title, $cat, $local_category,
    $local_head_title, $local_category_title,$s,$author_name,$post;</p>
<p>    if(is_category()){
        $local_category = get_category($cat);
        $local_category_title = $local_category->name;</p>
<p>        if($local_category->parent)
            $local_page_title = get_category_parents($local_category->parent, false, '');</p>
<p>        if($local_page_title)
            $local_head_title = wp_title('', false, 'right').' &laquo; '.$local_page_title . ' | ';
        else
            $local_head_title = wp_title('', false, 'right'). ' | ';</p>
<p>    } elseif(is_author()) {
        $author = get_query_var('author');
        $author_obj = get_userdata($author);</p>
<p>        $local_category_title ='';
        $local_page_title = $author_obj->last_name.$author_obj->first_name;
        $local_head_title = $local_page_title. ' | ';</p>
<p>    }else if(is_archive()){</p>
<p>        if(is_tag()){
            $tag = get_query_var('tag_id');
            $tag = get_term($tag, 'post_tag', OBJECT, 'display');</p>
<p>                //var_dump($tag);
                if ( is_wp_error( $tag ) )
                    $local_page_title = $tag;
                if ( ! empty($tag->name) )
                    $local_page_title = apply_filters('single_tag_title', $tag->name);</p>
<p>                $local_head_title = wp_title('', false, 'right').' | ';
                $local_category_title = 'タグ: '.$local_page_title;</p>
<p>        }elseif(is_day()){
            $local_category_title = get_the_time(get_option('date_format'));
            $local_page_title = $local_category_title.'のアーカイブ';
            $local_head_title = $local_page_title.' | ';</p>
<p>        }elseif(is_month()) {
            $local_category_title = get_the_time('Y年F');
            $local_page_title = $local_category_title.'のアーカイブ';
            $local_head_title = $local_page_title.' | ';
        } elseif(is_year()) {
            $local_category_title = get_the_time('Y年');
            $local_page_title = $local_category_title.'のアーカイブ';
            $local_head_title = $local_page_title.' | ';
        }</p>
<p>    }else if(is_search()){
        $allsearch =& new WP_Query("s=$s&showposts=-1");
        $key = wp_specialchars($s, 1);
        $count = $allsearch->post_count;
        $local_category_title = "検索結果";</p>
<p>        if($count!=0){
            $local_head_title = "『".$key."』の検索結果 | ";
            $local_page_title = '<em>'.$key.'</em>で検索した結果、<strong class="count">'.$count.'件</strong>ヒットしました。';
        }else{
            $local_head_title = "『".$key."』の検索結果 | ";
            $local_page_title = '<em>'.$key.'</em>で検索しましたが、何も見つかりませんでした。';
        }</p>
<p>    }else if(is_page()){
        if($post->post_parent){
            $local_category_title = get_the_title($post->post_parent);
            $local_head_title = wp_title('&laquo;', false, 'right').$local_category_title." | ";
        }else{
            $local_head_title = wp_title('', false, 'right')." | ";
        }
        $local_page_title = get_the_title();</p>
<p>    }else if(is_single()){</p>
<p>        if(is_attachment()){
            $local_category_title = get_the_title($post->post_parent);
        }else{
            $local_category = get_the_category();
            $local_page_title = $local_category[0]->cat_name;</p>
<p>        /*if($local_category[0]->parent){
            $local_head_title = get_category_parents($local_category[0]->parent, false, '');
        }*/
            $local_page_title = get_the_title();
            $local_category_title = $local_category[0]->cat_name;
        }
            $local_head_title = wp_title('', false, 'right').' &laquo; '.$local_category_title. ' | ';
    }else if(is_404()){
        $local_category_title = __('Error');
        $local_page_title = __('404 Not Found');
        $local_head_title = wp_title('', false, 'right')." | ";
    }
}</p>
<p>add_action('get_header', set_page_title, 10);

//ぱんくず

function breadcrumb(){
    global $local_body_id, $local_page_title, $local_category,$local_category_title,$post;</p>
<p>    if(!is_home()&&!is_front_page()){
        print '
<p class="breadcrumb">';
        print ''.__('Home').'&gt; ';</p>
<p>    if(is_category()){
        if($local_category->parent)
            echo(get_category_parents($local_category->parent, TRUE, '&gt; '));
        print '<span class="current">'.single_cat_title().'</span>';</p>
<p>    } elseif (is_author()) {
        print '<span class="current">ユーザー&gt; '.$local_page_title.'</span>';
    }else if(is_archive()){</p>
<p>        if(is_tag()){
            print 'タグ:'.'<span class="current">'.$local_page_title.'</span>';
        }else{
            print '<span class="current">'.$local_page_title.'</span>';
        }</p>
<p>    }else if(is_search()){
        print '<span class="current">サイト内検索</span>';
    }else if(is_page()){
        if($post->post_parent)
            print '<a href="'.get_permalink($post->post_parent).'" title="'.the_title_attribute('echo=0').'">'.get_the_title($post->post_parent).'</a>&gt; ';
        print '<span class="current">'.the_title().'</span>';</p>
<p>    }else if(is_single()){</p>
<p>        if(is_attachment()){
            print '<a href="'.get_permalink($post->post_parent).'" title="'.the_title_attribute('echo=0').'">'.get_the_title($post->post_parent).'</a>&gt; ';
        }else{
            if($category[0]->parent)
                echo(get_category_parents($local_category[0]->parent, TRUE, '&gt; '));</p>
<p>            print '<a href="'.get_category_link($local_category&#91;0&#93;->term_id).'">'.$local_category[0]->cat_name.'</a>&gt; ';
        }
        print '<span class="current">'.the_title().'</span>';</p>
<p>    }else{
        print '<span class="current">'.$local_page_title.'</span>';
    }</p>
<p>    print '</p>
<p>';</p>
<p>    }
}

元ソースと見比べて貰えば分かると思いますが、三行目の

if(!is_home()||!is_front_page()){

if(!is_home()&&!is_front_page()){

に改変しています。この方が適正かと個人的には思います故。

一昨日投稿時には改変箇所の記述を忘れて元ソースをそのまま丸写しただけでした。訂正してお詫びします。(これはこれで元ソースが何らかの事情で消えてしまった場合の「有益な情報を保存しておく」意味はあるでしょうけど)

2012年4月7日3時34分 加筆訂正:バグ除去。 

get_the_time('Y年F');

の記述を

get_the_time(get_option('date_format'));

に変更。こちらの方がスマートなので。

%d人のブロガーが「いいね」をつけました。