WordPressで抜粋で記事中のショートコードを実行する方法

例えば、Amazonのアソシエイトリンクを生成するショートコードを記事の先頭の方に記載すると、記事一覧ページの抜粋部分にショートコードが含まれることがあります。

抜粋で記事内のショートコードを実行するには、以下のようにします。

//ショートコード
function amazon_link($params = array()) {
  extract(shortcode_atts(array(
  'asin' => '',
  'title' => ''
  ), $params));
 $html = '';
 $html .='<a href="http://www.amazon.co.jp/dp/' . $asin . '?tag=trakingid">' . $title . '</a>';
 return $html;
}
add_shortcode('amazon', 'amazon_link');

//抜粋でショートコードを実行する
remove_filter( 'get_the_excerpt', 'wp_trim_excerpt' ); //Remove the filter we don't want
add_filter( 'get_the_excerpt', 'fergcorp_wp_trim_excerpt' ); //Add the modified filter
add_filter( 'the_excerpt', 'do_shortcode' ); //Make sure shortcodes get processed
//Copy and paste from /wp-includes/formatting.php:2096
function fergcorp_wp_trim_excerpt($text = '') {
 $raw_excerpt = $text;
 if ( '' == $text ) {
 $text = get_the_content('');
 //$text = strip_shortcodes( $text ); //Comment out the part we don't want
 $text = apply_filters('the_content', $text);
 $text = str_replace(']]>', ']]&gt;', $text);
 $excerpt_length = apply_filters('excerpt_length', 55);
 $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
 $text = wp_trim_words( $text, $excerpt_length, $excerpt_more );
 }
 return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
}

抜粋の文字数を変更する場合は$excerpt_length = apply_filters(‘excerpt_length’, 55);の「55」部分を変更します。

参考

Using Shortcodes in the_excerpt – Andrew Ferguson dot NET