私はこれを頭に入れています。これは、特定の投稿タイプを表示するために作成したショートコードループです。
function faq_shortcode($atts, $content = NULL) {
extract(shortcode_atts(array(
'faq_topic' => '',
'faq_tag' => '',
'faq_id' => '',
'limit' => '10',
), $atts));
$faq_topic = preg_replace('~�*([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $faq_topic);
$faq_tag = preg_replace('~�*([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $faq_tag);
$faqs = new WP_Query(array(
'p' => ''.$faq_id.'',
'faq-topic' => ''.$faq_topic.'',
'faq-tags' => ''.$faq_tag.'',
'post_type' => 'question',
'posts_per_page' => ''.$limit.'',
'orderby' => 'menu_order',
'order' => 'ASC'
));
$displayfaq= '<div class="faq_list">';
while ($faqs->have_posts()) : $faqs->the_post();
$displayfaq .= '<div class="single_faq">';
$displayfaq .= '<h3 class="faq_question">'.get_the_title().'</h3>';
$displayfaq .= '<p class="faq_answer">'.get_the_content().'</p>';
$displayfaq .= '</div>';
endwhile;
wp_reset_query();
$displayfaq .= '</div>';
return $displayfaq;
}
add_shortcode('faq','faq_shortcode');
これらのループのうちの1つの中に、使用されているショートコードを持つ投稿があります
function emailbot_ssc($atts, $content = null) {
extract( shortcode_atts( array(
'address' => '',
), $atts ) );
ob_start();
echo '<a href="mailto:'.antispambot($atts['address']).'" title="email us" target="_blank" rel="nofollow">'.$atts['address'].'</a>';
$email_ssc = ob_get_clean();
return $email_ssc;
}
add_shortcode("email", "emailbot_ssc");
FAQループ(コード項目#1)は、ショートコードを解析しません。生のまま表示するだけです。
get_the_content()
にはthe_content
フィルターが適用されていません。ここではdo_shortcode()
がフックされています。これらのフィルターはthe_content()
でのみ適用されます。これらの2つの関数は、単に互いのget/echoバージョンではありません。 get_the_content()
は下位レベルです。
これはAPIの異常であり、歴史的な理由によるものです。たとえば、get_the_title()
はthe_title
フィルタを適用します。
the_content
フィルタスタック全体を適用したい場合は、次のようにします。
apply_filters( 'the_content', get_the_content() )
あなたがだけショートコードを適用したい場合は、次のようにします。
do_shortcode( get_the_content() )