为什么我的[短代码]显示为WP编辑器的纯文本?

时间:2017-09-12 00:53:43

标签: php wordpress

我试图使用短代码在我网站的不同页面上执行特定于标签的内容循环。我知道我的短代码功能正常工作,因为当我将bash-3.2$ python Python 2.7.12 (default, Nov 29 2016, 14:57:54) [GCC 4.2.1 Compatible Apple LLVM 7.0.2 (clang-700.1.81)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> d1 = ['tyuri:12345', 'hsksfd:58380', 'shskfks:49539'] >>> d1 ['tyuri:12345', 'hsksfd:58380', 'shskfks:49539'] >>> d2 = ['12345', '442342', '8053308'] >>> d2 ['12345', '442342', '8053308'] >>> m1 = dict(map(lambda x:(x.split(":")[1],x),d1)) >>> m1 {'49539': 'shskfks:49539', '58380': 'hsksfd:58380', '12345': 'tyuri:12345'} >>> for v in d2: ... if v in m1: ... print(m1[v]) ... tyuri:12345 硬编码到我的页面模板中时,它会完美地显示出来。

但是当我尝试将do_shortcode直接添加到Wordpress编辑器中时,它显示为纯文本。我有什么想法可以解决这个问题吗?

您可以看到我正在谈论的内容here - 您看到的[shortcode]纯文本直接写入Wordpress文本编辑器。它无法正常工作。在其下方,您会看到[showtag tag="seefour"]正在从页面模板中正确执行我的内容循环。

我有什么想法可以解决这个问题?硬编码<?php echo do_shortcode("[showtag tag='seefour']"); ?>对我来说是不可持续的。该网站目前只有两个活动插件,但是这个问题在停用后仍然存在,所以我不知所措。

为了更好的衡量,这是我尝试执行的内容循环:

do_shortcode

这是 page.php 模板代码:

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' );

到目前为止,我找到的解决方案都没有奏效,所以我愿意接受建议......

2 个答案:

答案 0 :(得分:2)

您的主题似乎没有使用帖子的内容执行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 ) ); ?>

P上。 S.您还应该避免使用&lt; =因为它不适用于大多数主机并且不鼓励使用。

答案 1 :(得分:0)

从我正在处理的插件中查看此代码,这是很久以前但你可以看到包含“do_shortcode()”函数,尝试将其添加到$ output。

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' );