WordPressの管理画面には、【作成】【リンク】というタブがあり、URL・サイト名・一言の3つを登録して管理できるようになっています。
ただ残念なのが、表示される場所です。
【リンク】でどんどん登録していったリンクは、サイドバーに表示することが前提になってるっぽいです。
サイドバーとは、画面の右側のカレンダーとかカテゴリ一覧のある場所です。
サイト数が少ないうちはそれでも良いのですが多くなってくると見た目と使い勝手の両面から、できればカテゴリごとにページ単位に表示したくなってくることと思います。
で、私が最初にとった方法は、【作成】【ページ】から”ページ”としてリンク集を手打ちで作っていく方法です。1サイトずつ手入力です。WordPressには【作成】【リンク】というリンク管理が用意されているのに、それを使わないのです。
まぁ案の定、面倒になりますよね。
やっぱりWordPress自身を改造する必要がありそうです。
もしかしたらプラグインなどで既にあるのかもしれませんが、Googleさんに聞いてもスグには答えを教えてくれなかったので、改造してしまうほうが早いと判断しました。根気がある方は、プラグインを探してみてください。
で、WordPressにリンク集ページを作成するために行った改造
下記の改造で作成されるリンク集は、リンクをご覧ください。
では、前提条件です。
- 私自身がWordPressを知り尽くしていない
- できるだけ早く実装したい
- WordPress本体側の変更は避けたい
- 変更箇所は、できるだけ1つのファイルだけで完結したい
- 『テーマ』は、しょっちゅう変えるものではない
ここで大事なのは、3、4番目の項目です。
PHPファイルをあちこち修正してしまうと、時間が経つとどのファイルのどの場所を変更したのか分からなくなってしまいます。特にWordPress本体側に手をつけてしまうと、WordPressがバージョンアップしたときに、アップデート手順がややこしくなってしまいます。
あと、5番目の『テーマ』ですが、テーマってそんな頻繁に変更したりするものですか?ここで紹介する私が行ったことは、テーマファイルとして作成する方法なので、テーマを変更したときは同じ手順でテーマファイル(links.php)を作成する必要があります。
FTPで、/wp-content/themes/XXX/page.phpをダウンロードします。
/XXX/の部分は、現在使用している”テーマ”です。
page.phpをダウンロードしたら、”links.php”などと名前を変更してください。名前は特になんでも構いません。
links.phpをテキストエディタで開きます。
links.phpファイルの先頭に、↑の内容を加えます。
links がテンプレートの名称になります。お好みで変更しても構いません。
the_content(
この部分を探してください。
the_content関数は、該当するページの”本文”を出力する関数です。
とりあえず、これから作成しようとしている改造が正しく行えるかテストします。
the_content(...);
echo 'links test';
このように、echo ‘links test’; を書き加えてください。
the_content(…) の引数の部分は、テーマファイルにより異なります。
便宜上 (…) と書いていますが、変更しないでください。
保存して、/wp-content/themes/XXX/ にアップロードします。
links.phpに名前を変えているので、links.phpとpage.phpの両方が存在する形になります。page.phpは、何も変更を行いません。
ここで、ブラウザからWordPressの管理画面を開きます。
- 【作成】【ページ】で、ページを新規作成します。
- 『タイトル』には、”リンク”などとお好きな名前を付けてください。
- 『本文』には、”リンク集です。”などとご自由に書いてください。
- タイトルや本文は、【管理】【ページ】からいつでも変更できます。
- 『親ページ』で、”メインページ(親ページなし)”を選択します。
- 『ページテンプレート』で、”links”(※)が選択できるようになっているので選択します。
- 『公開』ボタンを押してください。
※ Template Name: で links から変更していれば、その名前です。
ブログの閲覧者側のほうから、先ほど作成したページを開いてください。
『本文』を読んでください。
『本文』の最後に、’links test’ という文字は見えますか?
‘links test’ が見えていればOKです。次の手順に進みます。
links.phpをテキストエディタで開きます。
先ほど書き加えた、echo ‘links test’; は不要ですので削除します。
the_content(...);
aulta_wp_list_bookmarks();
↑のように、aulta_wp_list_bookmarks(); を書き加えてください。
links.phpファイルの末尾に移動し、次のように書き加えます。
'name', 'order' => 'ASC',
'limit' => -1, 'category' => '', 'exclude_category' => '',
'category_name' => '', 'hide_invisible' => 1,
'show_updated' => 0, 'echo' => 1,
'categorize' => 1, 'title_li' => __('Bookmarks'),
'title_before' => '<h2>', 'title_after' => '</h2>',
'category_orderby' => 'name', 'category_order' => 'ASC',
'class' => 'linkcat', 'category_before' => '<li class="%class">',
'category_after' => '</li>'
);
$defaults[""] = "";
$r = wp_parse_args( $args, $defaults );
extract( $r, EXTR_SKIP );
$output = '';
$CategoryName = '';
// 選択されたリンクIDをgetする
$linkid = aulta_getOutsideVariable("aulta_linkid", "get");
if ( ! ereg("^[0-9]+$", $linkid)){
$linkid = -1;
}
// カテゴリリスト
$cats = get_terms('link_category', array('name__like' => $category_name, 'include' => $category, 'exclude' => $exclude_category, 'orderby' => $category_orderby, 'order' => $category_order, 'hierarchical' => 0));
$i = 0;
$output_cat = "";
foreach ( (array) $cats as $cat ) {
if ($i++ > 0) $output_cat .= ' / ';
if ($cat->term_id == $linkid){
$CategoryName = $cat->name;
$output_cat .= '<strong>' . $cat->name . '</strong>';
} else {
$output_cat .= '<a>term_id . '">' . $cat->name . '</a>';
}
}
$output .= $output_cat;
// リンクデータ
if (strlen($CategoryName) > 0){
$output .= '<h3>' . $CategoryName . '</h3>';
$output .= '<dl>';
$params = array_merge($r, array('category'=>$linkid));
$bookmarks = get_bookmarks($params);
if ( ! empty($bookmarks) ){
$output .= aulta_walk_bookmarks($bookmarks, $r);
}
$output .= '</dl>';
$output .= '<hr />' . $output_cat;
}
$output = apply_filters( 'wp_list_bookmarks', $output );
if ( !$echo )
return $output;
echo $output;
}
aulta_wp_list_bookmarks() は、WordPress本体側の wp_list_bookmarks() をコピーしたものをベースにしています。関数名の先頭に、 aulta_ を付けることで、WordPress側と重複しない関数名であることを保証させています。
コード中のコメント『カテゴリリスト』のところで、”リンクカテゴリ”の一覧を出力し、『リンクカテゴリ』のところで選択された”リンクカテゴリ”に該当するリンクデータを出力するようにしています。
続けて、下記を追加します。
function aulta_walk_bookmarks($bookmarks, $args = '' ) {
$defaults = array(
'show_updated' => 0, 'show_description' => 0,
'show_images' => 1, 'before' => '<li>',
'after' => '</li>', 'between' => "n",
'show_rating' => 0
);
$defaults["show_description"] = 1;
$r = wp_parse_args( $args, $defaults );
extract( $r, EXTR_SKIP );
$output = ''; // Blank string to start with.
foreach ( (array) $bookmarks as $bookmark ) {
if ( !isset($bookmark->recently_updated) )
$bookmark->recently_updated = false;
//$output .= $before;
if ( $show_updated && $bookmark->recently_updated )
//$output .= get_option('links_recently_updated_prepend');
$the_link = '#';
if ( !empty($bookmark->link_url) )
$the_link = clean_url($bookmark->link_url);
$rel = $bookmark->link_rel;
if ( '' != $rel )
$rel = ' rel="' . $rel . '"';
$desc = attribute_escape(sanitize_bookmark_field('link_description', $bookmark->link_description, $bookmark->link_id, 'display'));
$name = attribute_escape(sanitize_bookmark_field('link_name', $bookmark->link_name, $bookmark->link_id, 'display'));
$title = $desc;
if ( $show_updated )
if ( '00' != substr($bookmark->link_updated_f, 0, 2) ) {
$title .= ' ';
$title .= sprintf(__('Last updated: %s'), date(get_option('links_updated_date_format'), $bookmark->link_updated_f + (get_option('gmt_offset') * 3600)));
$title .= ')';
}
if ( '' != $title )
$title = ' title="' . $title . '"';
$alt = ' alt="' . $name . '"';
$target = $bookmark->link_target;
if ( '' != $target )
$target = ' target="' . $target . '"';
$output .= '<dt><a>' . $name . '</a></dt>';
if ( $show_description && '' != $desc )
$output .= '<dd>' . $desc . '</dd>';
} // end while
return $output;
}
aulta_walk_bookmarks()も、 WordPress側のwalk_bookmarks()関数をコピーしたものをベースとしています。ここでは、リンクする”サイト1つ分”の出力形式を指定しています。
続けて次のコードを追加します。
function aulta_getOutsideVariable($Name, $Type, $Charset = "utf-8", $Decode = false)
{
$ret = "";
switch (strtolower($Type)){
case "get":
if (isset($_GET[$Name])) $ret = $_GET[$Name];
break;
case "post":
if (isset($_POST[$Name])) $ret = $_POST[$Name];
break;
case "cookie":
if (isset($_COOKIE[$Name])) $ret = $_COOKIE[$Name];
}
$ret = str_replace("", "", $ret);
if (strlen($ret) > 0) {
if ($Decode){
$ret = str_replace("+", "%2B", $ret);
$ret = urldecode($ret);
}
$ret = trim(mb_convert_encoding($ret, $Charset
, $Charset . ", JIS, eucjp-win, sjis-win, utf-8"));
$ret = htmlspecialchars($ret, ENT_QUOTES, $Charset);
$ret = str_replace(''', ''', $ret);
$ret = str_replace('"', '"', $ret);
$ret = str_replace("rn", "n", $ret);
$ret = str_replace("r", "n", $ret);
return $ret;
}
return "";
}
aulta_getOutsideVariable() は、GET, POST, COOKIE を安全に取得するfunction() をお読み下さい。
先述してますが、関数名の先頭に、aulta_ を加えることで、WordPress本体側で使用されていないことを保証させています。
ここまで出来たら、links.phpをアップロードして、ブラウザで表示内容を確認します。
表示が確認できたら、WordPressの管理画面から『リンクカテゴリ』と『リンク』を自由に作成していくだけです。リンク表示のデザインなどを変更したい場合は、aulta_wp_list_bookmarks() と aulta_walk_bookmarks() の中を変更します。
改造内容のまとめ
- 既存コードから変更するファイルは1つもない
- 新たに、links.phpを追加する
- リンク集に必要なプログラムはlinks.phpだけで完結
- WordPressのリンク管理機能を利用する