0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

WordPress のショートコードが動かない場合に確認すること

Last updated at Posted at 2018-05-17

お問い合わせで、某有料テーマに切り替えたところショートコードが動かなくなってしまったという事例があったので解決法をご紹介します。

出力の関数が the_content になっているか確認する

今回の事例では、本文の出力部分がこのようになっていました。

content.php
<div class="entry-content">
	<p>
		<?php
			 if( ! is_single() )
			echo get_home_blog_excerpt();
			 else
			echo get_the_content();
		?>
	</p>
</div>

解決方法

注目ポイントは、get_the_content で、ここを the_content と修正すると解決します。
p タグの修正などもまとめて直した結果はこちらです

content.php
<div class="entry-content">
	<?php
		if( ! is_single() )
			echo '<p>' .get_home_blog_excerpt() .'</p>';
		else
			the_content();
	?>
</div>

原因

今回の元ソースにあるget_the_contentは、本文を echo せずに取得できるため、たとえばトップページの記事一覧で文字数を制限したい場合などに便利です。

ところが、ショートコードの変換などは、関数the_content 内にあるフィルターで変換されているのです。他にも、プラグインなどがフィルターを利用している場合がありますので、本文で使用する場合は必ずこちらの関数を使いましょう。

the_content のソースはこちら。apply_filters( 'the_content', $content ); という部分でいろいろな変換がされています。

wp-includes/post-template.php
function the_content( $more_link_text = null, $strip_teaser = false) {
    $content = get_the_content( $more_link_text, $strip_teaser );
 
    /**
     * Filters the post content.
     *
     * @since 0.71
     *
     * @param string $content Content of the current post.
     */
    $content = apply_filters( 'the_content', $content );
    $content = str_replace( ']]>', ']]&gt;', $content );
    echo $content;
}

テーマユニットテストで防止しよう

また、自分はテーマ作者だという方、クライアントワークで WordPress テーマを作っているという方は、こういったミスが起こらないように、事前にテーマテストユニットで確認することをオススメします!

the_content

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?