私は自分の投稿の抜粋を表示するために私の投稿に<!--more-->
タグを必要とする私のモバイルサイトのためのテーマを持っています。
私はすでに2000以上の投稿を持っています、そしてそれは私のすべての投稿にタグを追加するために永遠にかかるでしょう。私はプラグインを使いたくない、なぜなら私はまったく安定していなかったものを使ったからです。
特定の文字の後にmoreタグを追加したり、すべての投稿の中にWordを追加したり、それ以降に公開するすべての投稿の中に追加したりするためのスニペットが必要です。
文字列数を制御したい場合は、次のようにして実行できます。
アクティブなテーマのfunctions.phpファイルに以下のコードを入れてください -
function custom_excerpt_length( $length ) {
return 20; // You can change the number here as per your need.
}
add_filter( 'excerpt_length', 'custom_excerpt_length', 999 );
デフォルトでは、抜粋長は55ワードに設定されています。 excerpt_lengthフィルタを使用して抜粋の長さを20ワードに変更するには、上記のコードをテーマのfunctions.phpファイルに追加します。
詳細については、 Codex
を確認してください。
続きを読む(<!--more-->
)タグは、wp-includes/post-template.php
内のget_the_content()
によって処理されます。コンテンツ入力に対してフック可能なフィルタを実行しません。しかし、それは$pages
グローバルから来ていて、それはthe_post
アクションをフックすることによって設定される時に修正することができます。
次の関数は、280文字の後の最初のスペースに<!--more-->
タグを自動的に挿入します(HTMLタグをスキップし、空白のシーケンスを1文字として数える)。
\add_action(
'the_post',
function($post, $query) {
global $pages;
// Matches an HTML entity, block of whitespace, or single character:
static $rxChar = '(?:&#?+\\w++;|\\s++|[^<])';
// Matches zero or more HTML tags:
static $rxTags = '(?:<[^>]*+>)*+';
foreach ($pages as $i => $page) {
if (\strpos($page, '<!--more') === false) {
$page = \preg_replace(
// At least 280 characters, from the start, followed by a space
// (catastrophic failure with general repetition quantifier mitigated
// against by splitting into two multiplicative repetitions):
"/^(?:(?:$rxTags$rxChar){10}+){28}+" . $rxTags
. "(?:$rxChar$rxTags)*?(?=\\s)/u",
'$0<!--more-->',
$page,
1
);
if ($page !== null) {
$pages[$i] = $page;
} else {
trigger_error(
"Regex failure inserting 'Read More' tag into `$pages[$i]`."
);
}
}
}
},
10, 2
);
私は正規表現についてのいくつかのメモを追加するつもりですが、それはかなり自明のはずです。
u
(UTF-8)修飾子は、マルチバイト文字が必ず1つとして数えるようにします。+
(所有)数量詞 は、パフォーマンスとメモリ使用量を大幅に最適化します (ここで、トークンは次のトークンを消費できません)。ただし、一般的な繰り返し数量詞に適用した場合、失敗に対してそれほど大きな違いが生じることはないと思われるため、これは繰り返しの繰り返しに分割されています。それにもかかわらず、失敗した場合でも、コンテンツは変更されません。?
(lazy)数量詞は、最後ではなく、280文字が停止した後の最初のスペースを確保するためのものです。(私はこの質問が4年以上前に尋ねられたことを知っています、しかしそれは答えられませんでした。私はそれが全く同じための解決策を探しているのを見つけました。