previous_post_link関数を改良した例


WordPressで、個別ページの前後のリンクを生成する、previous_post_linknext_post_link関数は、フォーマットに記事タイトルを指定した場合全文表示します。

このため、前後リンクをコンテンツの左右に振り分けるデザインの場合、改行によって体裁が崩れることがあります。

これを、全角で指定した文字数に丸めるよう、改良する方法をご紹介します。

add_filterは使えない

WordPressの既存関数を改良する場合、add_filterで、関数内の処理中の値を書き換えるのが正しい作法です。 ですが今回のカスタマイズの対象となる関数は、リンクを追加する前の処理にapply_filtersが指定されておらず、この方法が使えません。

このため、コアの関数を元に新しく関数を定義することになります。

新規関数を追加する

テーマ内の「functions.php」に、以下の関数群を追加してください。

/* 前後リンクを生成(長いタイトルを丸める)
============================================= */

function WS_previous_post_link($maxlen = -1, $format='« %link', $link='%title', $in_same_cat = false, $excluded_categories = '') {
WS_adjacent_post_link($maxlen, $format, $link, $in_same_cat, $excluded_categories, true, $maxlen);
}
function WS_next_post_link($maxlen = -1, $format='%link »', $link='%title', $in_same_cat = false, $excluded_categories = '') {
WS_adjacent_post_link($maxlen, $format, $link, $in_same_cat, $excluded_categories, false);
}

function WS_adjacent_post_link($maxlen = -1, $format='« %link', $link='%title', $in_same_cat = false, $excluded_categories = '', $previous = true) {

if ( $previous && is_attachment() )
$post = & get_post($GLOBALS['post']->post_parent);
else
$post = get_adjacent_post($in_same_cat, $excluded_categories, $previous);

if ( !$post )
return;

$tCnt = mb_strlen( $post->post_title, get_bloginfo('charset') );
if(($maxlen > 0)&&($tCnt > $maxlen)) {
$title = mb_substr( $post->post_title, 0, $maxlen, get_bloginfo('charset') ) . '…';
} else {
$title = $post->post_title;
}

if ( empty($post->post_title) )
$title = $previous ? __('Previous Post') : __('Next Post');

$title = apply_filters('the_title', $title, $post->ID);
$date = mysql2date(get_option('date_format'), $post->post_date);
$rel = $previous ? 'prev' : 'next';

$string = '<a href="'.get_permalink($post).'" rel="'.$rel.'">';
$link = str_replace('%title', $title, $link);
$link = str_replace('%date', $date, $link);
$link = $string . $link . '</a>';

$format = str_replace('%link', $link, $format);
echo $format;
}

テーマを書き換える

テーマ内で、previous_post_link・next_post_linkを使用している個所を探し、以下のように書き換えます。

<? WS_previous_post_link(最大文字数, フォーマット, リンクテキスト, 同じカテゴリー内でリンクするか, 除外するカテゴリーID); ?>

<? WS_next_post_link(最大文字数, フォーマット, リンクテキスト, 同じカテゴリー内でリンクするか, 除外するカテゴリーID); ?>

コア関数との違いは以下の通りです。

  1. 関数名の先頭に「WS_」を追加
  2. 引数群の先頭に最大文字数を半角で追加、丸めない場合は-1

タイトルを丸めるだけであれば、以下のように数字のみ指定します。

<?php WS_previous_post_link(15); ?>

<?php WS_next_post_link(15); ?>

フォーマットなど、全てのオプションを指定する場合は以下の通りです。

<?php WS_previous_post_link( 15, '<li class="nav-p">%link</li>', '<span class="meta-nav">&larr; </span>%title', '99', true ); ?>

<?php WS_next_post_link( 15, '<li class="nav-n">%link</li>', '<span class="meta-nav">&larr; </span>%title', '99', true ); ?>

補足

全角で丸める処理には、マルチバイト関数のmb_strlenmb_substrを利用しています。 最新のWordPressが動作するサーバーであれば、問題なく使用できると思います。

関数名に付いている「WS_」はコアとの重複を防ぐための接頭辞です。筆者の屋号の略なので、任意で置換してください。