ブログテーマを「Simplicity2」から「Luxeritas」に変更したら、ブログカードが上手く動かなかったのでfunctions.phpを編集しました

2017年9月14日WordPress,技術

画像出典:Luxeritas Theme

この記事は2017年8月24日に書かれたものです。ご注意ください。

タイトルにやったことをぶち込みすぎた感ありますね…

テーマをSimplicity2からLuxeritasに変更したら、何故かブログカードが上手く動かない…!という現象が起こりました。調べてみたら意外にも原因は簡単で、Simplicity2では記事内に<a href="https://prfac.com/" target="_blank">https://prfac.com/</a>と記載しても動くのですが、Luxeritasではdata-blogcard="1"が必要みたいで、同じ記載方法だと動かないようでした。

data-blogcard="1"を追加すればいいけど、考えるの面倒くさいので<a href="https://prfac.com/" target="_blank">https://prfac.com/</a>のアンカータグを削除すればええやん!?天才!!という思考の元、書いたソースコードは以下になります(コメントは削除して貰ってかまいません)。

function anchor_tag_delete($the_content) {
    global $post;
    preg_match_all("|<a href=\"(.*?)\".*?>(.*?)</a>|mis",$post->post_content,$matches);
    //var_dump($matches);
    $matches_count=count($matches[0]);
    for ($i=0; $i<$matches_count; $i++){
        $tag=$matches[0][$i]; // <a href="https://prfac.com/" target="_blank">Pr factory</a>
        $url=$matches[1][$i]; // https://prfac.com/
        $txt=$matches[2][$i]; // Pr factory
        if ($url===$txt && strpos($tag,'blogcard')===false){
            $the_content = str_replace($tag, $url, $the_content);
        }
    }
    return $the_content;
}
add_filter('the_content', 'anchor_tag_delete', 1);

解説的なの

今回やりたい内容としては<a href="https://prfac.com/" target="_blank">https://prfac.com/</a>https://prfac.com/にしたい。という事なので、書くコードは「各コンテンツのURLを確認。アンカータグの“href”と“テキスト”が一致していたらアンカータグを削除する」ということになります。

ではまず「各コンテンツ」の内容を取得する必要があります。

function anchor_tag_delete($the_content) {
}
add_filter('the_content', 'anchor_tag_delete', 1);

グローバル変数を使う為の宣言をします。

global $post;

マッチングでアンカータグを取得してきます。

preg_match_all("|<a href=\"(.*?)\".*?>(.*?)</a>|mis",$post->post_content,$matches);

マッチングしたアンカータグ達を確認のために一覧として表示させたいなー、って時はvar_dumpを記載すると確認できます。

var_dump($matches);

以下のような感じで表示されます(本番反映時には邪魔なのでコメントアウトさせて下さい)。

array(3) {
  [0]=>
  array(4) {
    [0]=>
    string(157) "<a href="http://twpf.jp/micelle9" title="五十嵐みせる(@micelle9)のプロフィール - ツイフィール" target="_blank">http://twpf.jp/micelle9</a>"
    [1]=>
    string(82) "<a href="https://twitter.com/micelle9/status/514780504537575424">2014, 9月 24</a>"
    [2]=>
    string(63) "<a href="http://t.co/Xdv6fNDkRv">pic.twitter.com/Xdv6fNDkRv</a>"
    [3]=>
    string(83) "<a href="https://twitter.com/micelle9/status/525672210115985409">2014, 10月 24</a>"
  }
  [1]=>
  array(4) {
    [0]=>
    string(23) "http://twpf.jp/micelle9"
    [1]=>
    string(54) "https://twitter.com/micelle9/status/514780504537575424"
    [2]=>
    string(22) "http://t.co/Xdv6fNDkRv"
    [3]=>
    string(54) "https://twitter.com/micelle9/status/525672210115985409"
  }
  [2]=>
  array(4) {
    [0]=>
    string(23) "http://twpf.jp/micelle9"
    [1]=>
    string(13) "2014, 9月 24"
    [2]=>
    string(26) "pic.twitter.com/Xdv6fNDkRv"
    [3]=>
    string(14) "2014, 10月 24"
  }
}

アンカータグの数($matches[0]の数)をカウントします。

$matches_count=count($matches[0]);

アンカータグの数だけfor()でぶん回します。

for ($i=0; $i<$matches_count; $i++){
}

for()でぶん回してるアンカータグ、URL、テキストを変数に格納します(コメントについては削除して貰ってかまいません)。

$tag=$matches[0][$i]; // <a href="https://prfac.com/" target="_blank">Pr factory</a>
$url=$matches[1][$i]; // https://prfac.com/
$txt=$matches[2][$i]; // Pr factory

ifでURLとテキストが一致したとき、アンカータグの内容をURlに置換します(ただしアンカータグに“blogcard”の記載があったら除外します)。

if ($url===$txt && strpos($tag,'blogcard')===false){
    $the_content = str_replace($tag, $url, $the_content);
}

そんでそれらをコンテンツへ返します。

return $the_content;

たぶん、どのテンプレートでも使えるかと思います。

参考サイト