現役プログラマのWordPressカスタマイズ相談

WordPress(ワードプレス)のお悩み、うまくいかなくてお困りなこと、不具合調査、新規制作依頼まで、ウェブアプリケーションエンジニアがあなたをサポートします。

目次(TOC)プラグインをウィジェットに配置したが見出しにショートコードがあると変換されない

WordPressで「Table Of Contents Plus(TOC+)」と「Advanced Custom Fields」を使った時の話。

f:id:jsaz:20180505102513p:plain:w360

テーマはsangoを使用していて、下記のカスタマイズガイドのように目次プラグインのTable Of Contents Plus(TOC+)の設定を行いました。

テーマ標準機能の追尾サイドバーウィジェットに目次を表示させたいと思い適用しました。

saruwakakun.com

カスタムフィールドを記事本文中で使うにはACF(Advanced Custom Fields)のショートコードを使います。

こんな感じ↓

[acf field="name"]

 

見出しでカスタムフィールド使っていました。 本文中の目次(TOC)は正常に表示されるのにウィジェットに配置した目次(TOC)はショートコードが変換されずにそのまま表示されてしまうという現象にぶつかってしまいました。 

どうにか解消したいと調べたのでまとめました。

見出しでカスタムフィールドとは?

<h2>[acf field="name"]とは?</h2>

みたいな記述を本文中にしていました。

本文に自動生成してくれる目次(TOC)はショートコードが変換されたあとの正常な文言が表示されます。

表示↓

○○とは?

(※○○はカスタムフィールドで設定した値)

  この流れでウィジェット側の目次(TOC)も「○○とは?」と表示してほしかったのに、「[acf field="name"]とは?」という風に表示されちゃいました。

ショートコードが変換されずに出力されていたようです。

Table Of Contents Plus の解析

ウィジェット用の目次リストを生成している箇所はこちら

ファイル:table-of-contents-plus/toc.php

<?php
$items = $tic->extract_headings( $find, $replace, wptexturize($post->post_content) );

$post->post_content は記事入稿したそのままのデータが入ってきます。

これが原因っぽい

nandani.sakura.ne.jp

本文中のスクリプトはこちら。

「ショートコードが解釈された後に実行」と、コメントにも書いてあった!

<?php
add_filter( 'the_content', array(&$this, 'the_content'), 100 );    // run after shortcodes are interpretted (level 10)`

修正

プラグインを直接カスタマイズするのは危険(後述)だけど、仕方ないのでやってみます。

$post->post_contentをショートコード変換すれば解決できますので、 PHPでショートコードを実行するコード(関数)do_shortcode()を使います。

下記が修正後の1行。

<?php
$items = $tic->extract_headings( $find, $replace, wptexturize(do_shortcode($post->post_content)) );

こうすることで目次(TOCウィジェットでも見出しにショートコードを使うことができます。

注意点

プラグインを修正すると、プラグイン自体のアップデート時に上書きされる恐れがあり、せっかく対処したものが消えてしまうことがあります。

この点だけ注意してください。

アップデートをしないという選択肢はあまりおすすめできません。

アップデート時に都度修正箇所を確認するといった対応が必要です。

こんな感じでプラグインの解析、カスタマイズも対応できますのでお困りの方はお気軽にご相談ください!

ココナラ出品中↓

https://goo.gl/l6m5hT