お問い合わせ

SWELL不具合|投稿の抜粋文が表示されない時の対処方法

  • URLをコピーしました!

SWELLでは、ショートコードしかない投稿記事の場合、記事の抜粋が表示されません。

これはSWELLに限らず、ほとんどのテーマでも抜粋が表示されないと思います。

通常のテーマでは、記事の抜粋を生成するときに、次のステップで生成するためです。

  1. ショートコード展開前の記事を使用
  2. ショートコードを削除

ショートコードしかない記事の抜粋文が表示されないのは、SWELLの不具合ではなく仕様ですので、自分で無理やり表示させるようにカスタマイズする必要があります。

この記事では、ショートコードしかない記事で抜粋文を表示させるためのカスタマイズ方法についてご紹介します。

目次

SWELLでは抜粋をどのように生成しているか?

SWELLは、抜粋を生成するときに自前のラッパー関数であるSWELL_Theme::get_excerpt()を呼び出しています。

見てもらうとわかりますが、投稿の「抜粋」の入力内容があれば、do_shortcode()されます。

「抜粋」の入力内容が無い場合は、do_shortcode()されずに、wp_strip_all_tags()でタグとショートコードはすべて削除されます。

	/**
	 * 抜粋文を取得
	 */
	public static function get_excerpt( $post_data, $length = null ) {
		$length = null === $length ? (int) self::$excerpt_length : (int) $length;

		// 抜粋非表示の時
		if ( $length === 0 ) {
			return '';
		}

		// 抜粋文 作成
		if ( ! empty( $post_data->post_excerpt ) ) {

			// 「抜粋」の入力内容を優先
			$excerpt = strip_tags( $post_data->post_excerpt, '<br><i>' );
			$excerpt = do_shortcode( $excerpt );

		} elseif ( ! empty( $post_data->post_password ) ) {

			// パスワード保護の記事の場合
			$excerpt = __( 'この記事はパスワードで保護されています', 'swell' );

		} else {
			// 通常
			$excerpt = strip_shortcodes( $post_data->post_content );
			$excerpt = preg_replace( '/<h2.*>(.*?)<\/h2>/i', '【$1】', $excerpt );
			$excerpt = preg_replace( '/<rt.*>.*<\/rt>/i', '', $excerpt ); // ルビのふりがな削除
			$excerpt = wp_strip_all_tags( $excerpt, true );
			// $excerpt = mb_substr( $excerpt, 0, $length )." ... ";
			if ( mb_strwidth( $excerpt, 'UTF-8' ) > $length * 2 ) {
				$excerpt = mb_strimwidth( $excerpt, 0, $length * 2, '...', 'UTF-8' );
			}
		}
		return $excerpt;
	}

SWELLでショートコード展開後の抜粋分を表示させたいのであれば、「抜粋」の入力にショートコードを入力すれば良さそうです。

しかし、ショートコードしか本文が無いという記事はほとんどの場合は大量にあると思いますので、わざわざ「抜粋」の入力に入れるのが面倒問題になるだろうと思います。

では、特定の条件の時だけ、$post_data->post_excerptを上書きしてあげればよいのですが、残念ながら直接カスタムフィールドを読み込んでいるため、フック出来ません。

本当なら、get_the_excerpt()を呼び出してくれれば、get_the_excerptフックで上書きできるのですが、そうは問屋が卸さない仕様です。

ショートコードを展開して抜粋文を表示させるには?

SWELL_Theme::get_excerpt()はいじれないので呼び出し側で処理するしかなさそうです。

呼び出し側のparts\post_list\style_normal.phpのソースコードでは、以下のように抜粋文を作っています。

// 抜粋文
$excerpt = SWELL_Theme::get_excerpt( $post_data, $excerpt_length );

この部分を自分が好きなように書き換えればいいですね。

しかし、そのためには子テーマを作成して、parts\post_list\style_normal.phpを子テーマに用意して書き換える必要があります。

ここから先はケースバイケースなので、子テーマを作ってカスタマイズをしたい勇者の方が自己責任で抜粋文を表示させてみてください。

SEO SIMPLE PACKでもmeta descriptionが出力されない問題がある

SWELLと同じ作者のSEO SIMPLE PACKもショートコードしか本文が無い記事はmeta descriptionが生成されません。

同じように、抜粋対象にdo_shortcode()が適用されないためです。

解決方法

headのmeta descriptionだけショートコード展開して欲しいという場合はフックで簡単に対応できます。

SWELLの場合は、目次がjavascriptなのでshortcodeを展開しても目次が抜粋文に含まれることはありません。

function overwrite_ssp_description($ssp_description) {
	global $post;
	$post_id = $post->ID;
    
	if ( is_singular('post') ) {
		$word_count = apply_filters( 'ssp_description_word_count', 120 );

		$content = wp_strip_all_tags(do_shortcode($post->post_content));
		$content = mb_substr( $content, 0, $word_count );
		
		return $content;
    }
    return $ssp_description;
}
add_filter('ssp_output_description', 'overwrite_ssp_description');

まとめ

ショートコードしかない記事の抜粋文表示されない問題は、記事一覧やmeta descriptionに影響します。

記事一覧に抜粋文を表示している人は実は少ないような気がしますので、記事一覧に抜粋文が表示されない問題はあまりアツく議論されることは無いかもしれません。

ただ、meta descriptionが全く出力されないのはSEO的に問題があると思いますので、ショートコードしかない本文の記事ばかりのサイトでは対応しておいた方が良いかと思います。

この記事が気に入ったら
いいねしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

コメントは日本語で入力してください。(スパム対策)

目次