質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

Q&A

解決済

3回答

1810閲覧

【WordPress】抜粋でのショートコードの処理について

chef

総合スコア15

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

0グッド

0クリップ

投稿2018/02/25 11:29

編集2018/02/26 05:52

前提

エスケープされたショートコード(例:[[shortcode]])が記事本文の先頭にある場合、抜粋でそのショートコードが実行されてしまいます。
(また、普通のショートコードだとショートコードの部分が丸々消えてしまいます)

発生している問題・エラーメッセージ

例えば、以下のようにショートコードを登録し、

php

1function shortcode_test() { 2 return 'ショートコード'; 3} 4add_shortcode('shortcode', 'shortcode_test');

投稿画面でこのように記述して公開するとします。

WordPressには[shortcode]という便利なプラグインがあります。

すると、本文では「WordPressにはショートコードという便利なプラグインがあります。」と表示されますが、抜粋では「WordPressにはという便利なプラグインがあります。」と表示されます。

ここからが本題ですが、以下のように投稿画面でエスケープしたショートコードを使うとします。

ショートコードは[[shortcode]]と記述することで使えます。

すると、先ほどと同じ理屈で、本文には「ショートコードは[shortcode]と記述することで使えます。」と表示されますが、抜粋では「ショートコードはショートコードと記述することで使えます。」と表示されてしまいます。

変なプラグインも使っていないんですが、これはWordPressの仕様なんでしょうか?
みなさんの環境でも同じ動作をしますか?
何か対策をされていますか?(←これを知りたいです)

実現したいこと

本文と同じものを抜粋で表示したいです。
get_the_excerpt関数をどうにかできるのか、何かしらのフックがあるのか。。
お知恵をお借りできれば幸いです。

補足

説明がわかりづらかったため質問を修正しました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

以下のコードを追加して

function custom_excerpt() { global $post; $content = $post->post_content; $content = strip_shortcodes( $content ); $content = strip_tags( $content ); $content = str_replace( array( '\r\n', '\n', '\r', ' ' ), '', $content ); $content = mb_substr( $content, 60 ); echo $content; }

抜粋表示部分をcustom_excerpt()に置き換えたらどうなりますか?

追記

[[shortcode]]と入力した文字が抜粋表示(excerpt)では意向を無視してショートコードと表示されるという意味だったんですね?
ショートコードの使い方を説明するページだとしたら[shortcode]と表示されないと困りますね。
解決済ですがthe_excerpt()get_the_excerpt()をカスタマイズする例も書いておきます。
尚、エスケープ不要です。
出力はecho get_the_excerpt()the_excerpt()で。

function my_excerpt() { $excerpt = get_the_content(); $excerpt = wp_strip_all_tags( $excerpt ); $excerpt = str_replace( array( '\r\n', '\n', '\r', ' ' ), '', $excerpt ); $excerpt_more = apply_filters( 'excerpt_more', ' ' . '[…]' ); $excerpt = wp_trim_words( $excerpt, '60', $excerpt_more ); return $excerpt; } add_filter( 'wp_trim_excerpt', 'my_excerpt' );

投稿2018/02/26 01:52

編集2018/02/26 07:27
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chef

2018/02/26 05:04

回答いただきありがとうございます! 試したところ画面がカオスになりました…笑
退会済みユーザー

退会済みユーザー

2018/02/26 05:22

どのような事をされたのか分かりませんが、抜粋をcustom_excerpt()だけで表示するような書き方にすればエラーになったりしないと思いますが。
chef

2018/02/26 06:19

言葉足らずですみません! 「本文を取得し、ショートコードを削除、htmlやphpタグを削除、改行など削除、60文字に丸める」というコードだと思うのですが、ショートコードを使っている記事の抜粋はすべて消え、それ以外の記事の抜粋は本文がほとんど表示され(←ここをカオスと表現してしまいました)、思った通りの動作になりませんでした。 抜粋の表示は、関数の最後のechoをreturnにし、echo custom_excerpt();と記述しています。
chef

2018/02/26 06:40

最後の$content = mb_substr( $content, 60 );の部分を$content = mb_substr( $content, 0, 60 );にすることで文字を丸めることができました。 とても参考になりました、ありがとうございます!
chef

2018/02/26 07:08 編集

いただいた回答を参考に以下のようなコードにし、それをechoすることで現状は対応しようと思います。 ```php function custom_excerpt() { global $post; $content = $post->post_content; $content = strip_tags( $content ); $content = str_replace( array( '\r\n', '\n', '\r', ' ' ), '', $content ); $content = mb_substr( $content, 0, 60, 'UTF-8' ); return $content; } ```
chef

2018/02/26 08:55

追記いただきありがとうございます、参考にさせていただきます!
guest

0

状況が少しわかりませんが、下記部分でフィルタがかけれるようになっています。

【get_the_excerpt() | Function | WordPress Developer Resources】
https://developer.wordpress.org/reference/functions/get_the_excerpt/

PHP

1return apply_filters( 'get_the_excerpt', $post->post_excerpt, $post );

デフォルトでは下記フィルタしかかかっていないので、プラグインやテーマ内に別のフィルタがかかっている可能性もあります。

PHP

1// wp-includes/default-filters.php 148行 2add_filter( 'the_excerpt', 'wptexturize' ); 3add_filter( 'the_excerpt', 'convert_smilies' ); 4add_filter( 'the_excerpt', 'convert_chars' ); 5add_filter( 'the_excerpt', 'wpautop' ); 6add_filter( 'the_excerpt', 'shortcode_unautop'); 7add_filter( 'get_the_excerpt', 'wp_trim_excerpt' );

$post->post_excerpt ← これがとりあえずフィルタにかかる前なので、これを加工して出力するという手段もあると思います。

投稿2018/02/25 12:29

kei344

総合スコア69400

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chef

2018/02/26 01:04 編集

回答いただきありがとうございます! the_excerpt、get_the_excerpt、$post->post_excerpt、すべて試してみたのですが、やり方が悪いのか解決に至りませんでした。 今回の悩みを端的に申し上げると、「エスケープされたショートコードごと抜粋に表示したい」というものです。 WordPressの仕様だと思うのですが、本文の先頭に[[shortcode]]のようなエスケープされたショートコードがあり、記事の一覧で本文の先頭60文字を抜粋として使う場合、エスケープされたショートコードのエスケープが解除されてしまいます。 例えば、 ここにテキストが入ります。[[shortcode]]ここにテキストが入ります。 という文章が抜粋に表示されると、 ここにテキストが入ります。[shortcode]ここにテキストが入ります。 と変換されてしまい、抜粋の時だけショートコードが実行されてしまいます。 同様に、 ここにテキストが入ります。[[[shortcode]]]ここにテキストが入ります。 という文章が抜粋に表示されると、 ここにテキストが入ります。[[shortcode]]ここにテキストが入ります。 になります。 strip shortcodes関数や、http://wpdocs.osdn.jp/関数リファレンス/strip_shortcodesの用例を参考に試してみたのですが、さっぱりです。。
kei344

2018/02/26 04:11

$post->post_excerpt をそのまま出力しても括弧が消え、管理画面でのみ確認できるということでしょうか。
chef

2018/02/26 06:56

私のやり方が悪いのかもしれませんが、var_dumpしたところ中身が空でした。 本来は抜粋が取得できるということですよね?? 理解が追いついていなくてすみません。。
guest

0

本文でも、自動抽出された(先頭〇文字のような)抜粋でもショートコードを動作させないまま表示したいということですか??

それでしたら無理にエスケープしないで文字実体参照を使えばいいのかもしれませんね

例 [shortcode] を抜粋でも本文でもそのまま表示するなら [shortcode] とする

環境などにもよると思いますけど左の [ を [ にしただけです。一応私の環境でテストしたら本文でも抜粋(自動抽出)でも大丈夫でした。

投稿2018/02/26 02:30

momosiri

総合スコア1509

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chef

2018/02/26 04:59

回答いただきありがとうございます! 教えていただいたやり方だと確かにショートコードがエスケープされたまま表示されますね。これは便利です。 テキストエディタ→ビジュアルエディタへの変換時に通常のカッコに戻ってしまうんですが、これはどうしようもない感じでしょうか? ベストアンサーにしたいところなんですが、通常のエスケープされたショートコードをどうすれば抜粋でも扱えるのかという観点で本質的に解決策を見つけたいと思うので、もう少しだけ回答を募集させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問