固定ページに配置したWP SiteManagerのページャーが変!

本サイト「Arcany」にはブログ・フォト・ポートフォリオ・プロフィールの4つのカスタム分類を設定しており、これらのカスタム分類のトップページは固定ページとなっています。

ページの下にページ送り(ページャー)が配置されているのですが、固定ページのページャーのリンク先が変なのです。

WP SiteManagerのメニュー「サイト構造」で、各固定ページを各カテゴリーに紐付けて、

page.phpにページャーを出力する部分に以下のコードを記載しました。
<?php if ( class_exists( 'WP_SiteManager_page_navi' ) ) { WP_SiteManager_page_navi::page_navi(); } ?>

出力されたページャーはこれです。

カーソルを持ってくると分かるのですが、リンク先のクエリが「?page_id=68&paged=2」となって、ブログのアーカイブへのリンクになってくれません。(page_id=68の2ページ目という意味になっている)

それを修正するのに悪戦苦闘しました。WP_SiteManager_page_naviがどんなリンクを出力しているか「プラグイン編集」で中を覗いてみました。

wp-sitemanager/modules/page-navi.phpの中身

page-navi.phpがアンカー要素どうやって吐き出すかを見ると、

<a href="' . get_pagenum_link() . '">

get_pagenum_link()という関数でurlを生成しているようです。

かといって、この関数を修正するわけにもいかないし…そこで用いたのが「フィルターフック」です。

フィルターフックとは

いろいろ調べてみましたが、実行されたWordPress関数の出力結果を、更に関数で加工できる仕組みであることが分かりました。

get_pagenum_link()が生成するurl「?page_id=68」を「?post_type=blog」に変更する関数my_get_pagenum_link()を用意し、その関数をget_pagenum_link()に連結させたのがこちらです。


<?php
// 固定ページに表示されるページナビのリンク先のクエリを変更
//「page_id=xx」から「post_type=xx」に変更する。
function my_get_pagenum_link($links) {
$page_id = $_GET['page_id'];
$post = get_post( $page_id );
if ($post -> post_type = 'page') {
$post_type = $post->post_name;
$replace = 'post_type=' . $post_type;
$replaced = preg_replace('/page_id=[0-9]+/',$replace,$links);
return $replaced;
} else {
return $links;
}
}
add_filter('get_pagenum_link','my_get_pagenum_link',10,2);
?>

my_pagenum_link()について

$_GET[‘page_id’]で現在の固定ページ「page_id=xx」を取得し、投稿ID「xx」のスラッグ「blog」を取得して、get_pagenum_link()が吐き出したurlのクエリ「?page_id=xx」を「?post_type=blog」に置換しています。

add_filterについて

add_filter(出力結果を加工される関数,加工に使う関数,重要度)

で、WordPressが出力する関数の出力結果を加工することができます。

出力結果がこれです。

まとめ

フィルターフックは、WordPressが出力する関数に対して更に加工を行うことができます。そのため、WordPressのプラグインや関数そのもののPHPを触ることなく機能を拡張することができます。

今日はフィルターフックの使い方を紹介しました。これを応用して、ページの上のメニュータブをjQueryではなくPHPでオレンジ色にできたら良いなと思います。


コメントは受け付けておりません。