おすすめリンクを1つに統合してみた

このブログではエントリー下部に、他のエントリを読んで貰えることを期待してWhere did they go from hereYet Another Related Posts Plugin (YARPP)を使って、おすすめリンクを置いていましたが、それぞれで別々のリストが表示されてしまっていたので、1つのリストに統合してみました。

……何言ってるのかよくわかんないですね。単純に言うと、Where~とYARPPとで<ul></ul>が2つあったので1つにしました。ということです。

方針

方針としては単純で、Where~とYARPPが吐き出すhtmlのうち<li>~</li>の部分を取り出して、自前で<ul></ul>の中に放り込んであげることにします。

そのためにはまず、Where~とYARPPそれぞれで標準出力する前のデータを変数に取り出す必要があります。

YARPPの方はありがたいことにおすすめリンクの出力メソッドrelated_posts()の第3引数にechoの制御がありました。こいつをfalseにすると、画面出力されずにメソッドの返し値としてデータが受け取れます。

Where did they go from here の方ですが、出力メソッドのecho_ald_wherego()には特に指定がありませんが、プラグインのコードを見てみると単にald_wherego()というメソッドの返し値をそのまま出力しているだけのようです。ということでald_wherego()を利用することにしましょう。

これで、それぞれの出力データを変数に取り出すことは出来そうなので、後は適当に<li>~</li>の部分を取り出してあげればよさそうですね。それでは実際のコードを以下に。

コード


<?php
if(function_exists('related_posts') && function_exists('ald_wherego')){
    $rp  = related_posts(array(), false, false);
    $wg  = ald_wherego('is_widget=0');
    $tmp = $rp . $wg;
    // <li>~</li>だけ取得
    preg_match_all('/<li>.*?<\/li>/', $tmp, $match);
    if(count($match[0]) > 0){
        $check = array();
        $ret = array_filter($match[0],
                            function($v) use (&$check) {
                                if(preg_match('/href=["|\'](?P<href>.*?)["|\']/', $v, $m)){
                                    if(isset($check[$m['href']])){
                                        return false;
                                    }else{
                                        $check[$m['href']] = true;
                                        return true;
                                    }
                                }
                                return true;
                            }
                            );
        if(count($ret) > 0){
            shuffle($ret);
            $str  = "<h2>こちらも読んでみませんか?</h2>";
            $str .= "<ul>";
            $str .= implode('', $ret);
            $str .= "</ul>";
            echo $str;
        }
    }
}
?>

$checkで同一ページへのリンクをチェックして重複してリスト表示されないようにしています。最後にリストをシャッフルして表示のたびに順番が変わるようにもしてみました。

つーか書いてて思ったけど、データの取得はob_start()ob_get_clean()でやったほうが良いかもしらぬ。↓こんな感じ。これならプラグインの更新でメソッド仕様が変わっても大丈夫そうだし。


<?php
if(function_exists('related_posts') && function_exists('echo_ald_wherego')){
    ob_start();
    related_posts();
    echo_ald_wherego();
    $tmp = ob_get_clean();