Почему мои [шорткоды] отображаются в виде обычного текста из редактора WP?

Я пытаюсь использовать шорткоды для выполнения циклов содержимого для разных тегов на разных страницах моего сайта. Я знаю, что моя функция шорткода работает правильно, потому что, когда я жестко закодировал 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(); ?>

Ни одно из найденных мной решений не сработало, поэтому я открыт для предложений …

0

Решение

Похоже, ваша тема не выполняет 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 ) ); ?>

П.С. Также следует избегать использования <= поскольку он не работает на большинстве хостингов и не рекомендуется.

1

Другие решения

Посмотрите этот код из плагина, над которым я работаю, это было давным-давно, но вы можете видеть, что функция 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' );
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector