SWELL不具合|投稿の抜粋文が表示されない時の対処方法
SWELLの記事一覧で抜粋が表示したいのに、表示されないことでお悩みの場合は、カスタマイザーの設定を見直すことをお奨めします。
この記事は、抜粋を表示する指定にしているにもかかわらず、抜粋が表示されない人を対象にしています。
SWELLでは、ショートコードしかない投稿記事の場合、記事の抜粋が表示されません。
これはSWELLに限らず、ほとんどのテーマでも抜粋が表示されないと思います。
通常のテーマでは、記事の抜粋を生成するときに、次のステップで生成するためです。
- ショートコード展開前の記事を使用
- ショートコードを削除
- 抜粋を作成
この記事では、ショートコードしかない記事で抜粋文を表示させるためのカスタマイズ方法についてご紹介します。
特定の記事だけ抜粋が表示されない場合
記事の内容か、個別の記事の設定に起因します。
個別の記事の設定としては、抜粋入力欄があります。
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;
}
しかし、ショートコードしか本文が無いという記事はほとんどの場合は大量にあると思いますので、わざわざ「抜粋」の入力に入れるのが面倒問題になるだろうと思います。
では、特定の条件の時だけ、$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的に問題があると思いますので、ショートコードしかない本文の記事ばかりのサイトでは対応しておいた方が良いかと思います。
コメント