Я пытаюсь использовать шорткоды для выполнения циклов содержимого для разных тегов на разных страницах моего сайта. Я знаю, что моя функция шорткода работает правильно, потому что, когда я жестко закодировал do_shortcode
в мой шаблон страницы, он обнаруживается отлично.
Но когда я пытаюсь добавить [shortcode]
вместо этого непосредственно в редакторе WordPress, он отображается в виде простого текста. Есть идеи, как я могу это исправить?
Вы можете видеть, о чем я говорю Вот — [showtag tag="seefour"]
Вы видите, как обычный текст записывается непосредственно в текстовый редактор WordPress. Это не работает правильно. Чуть ниже вы увидите <?php echo do_shortcode("[showtag tag='seefour']"); ?>
правильно выполнить мой цикл содержимого из шаблона страницы.
Есть идеи, как я могу это исправить? жестко прописывать do_shortcode
не является устойчивым для меня. В настоящее время на сайте есть только два активных плагина, но эта проблема сохраняется после их деактивации, поэтому я в растерянности.
Для хорошей меры это цикл содержимого, который я пытаюсь выполнить:
function showtag_shortcode( $atts ) {
$atts = shortcode_atts( array(
'tag' => '', // Default value.
), $atts );
$posts = get_posts( 'tag=' . $atts['tag'] );
if ( $posts ) {
$output .= '<div class="jd-container">';
$output .= '<section class="jd-grid jd-pad1">';
foreach ( $posts as $post ) {
setup_postdata( $post );
$output .= '<div class="jd-box">';
$output .= '<a href="' . get_the_permalink( $post ) . '">';
$output .= get_the_post_thumbnail( $post );
$output .= '<div class="jd-overlay"></div>';
$output .= '<div class="jd-overlay-text">';
$output .= get_the_title( $post );
$output .= '</div>';
$output .= '</a>';
$output .= '</div>';
}
$output .= '</section>';
$output .= '</div>';
} else {
$output = 'no data';
}
wp_reset_postdata();
return $output;
}
add_shortcode( 'showtag', 'showtag_shortcode' );
А вот мой page.php код шаблона:
<?php get_header(); ?>
<section class="jd-backdrop">
<div class="jd-trans-row jd-container">
<h2 class=""><?php the_title(); ?></h2>
<br>
<p class=""><?= get_post_field('post_content', $post->ID) ?></p>
</div>
<?php echo do_shortcode("[showtag tag='seefour']"); ?>
</section>
<?php get_sidebar(); ?>
<?php get_footer(); ?>
Ни одно из найденных мной решений не сработало, поэтому я открыт для предложений …
Похоже, ваша тема не выполняет do_shortcode () с содержимым поста.
Попробуйте добавить следующее в functions.php
function the_content_filter( $content) {
return do_shortcode( $content);
}
add_filter( 'the_content', 'the_content_filter', 1000);
ОБНОВИТЬ
Из кода вашей темы мы видим, что вы используете get_post_field для вывода содержимого поста. В отличие от the_content (), эта функция не вызывает никаких фильтров. Вот почему приведенный выше код не работает в вашем случае.
Вы должны использовать get_post_field () следующим образом:
<?php echo do_shortcode( get_post_field( 'post_content', $post->ID ) ); ?>
П.С. Также следует избегать использования <= поскольку он не работает на большинстве хостингов и не рекомендуется.
Посмотрите этот код из плагина, над которым я работаю, это было давным-давно, но вы можете видеть, что функция do_shortcode () включена, попробуйте добавить ее в свой вывод $.
function rir_row( $params, $content = null ) {
extract( shortcode_atts( array(
'class' => 'rir-row'
), $params ) );
$content = preg_replace( '/<br class="nc".\/>/', '', $content );
$result = '<div class="' . $class . '">';
$result .= do_shortcode( $content );
$result .= '</div>';
return force_balance_tags( $result );
}
add_shortcode('rir_row', 'rir_row');
function rir_item( $params, $content=null ) {
extract( shortcode_atts( array(
'class' => 'col-sm-1'
), $params ) );
$result = '<div class="' . $class . '">';
$result .= do_shortcode( $content );
$result .= '</div>';
return force_balance_tags( $result );
}
add_shortcode( 'rir_item', 'rir_item' );