chris_o
  • 0
Гуру

Как заставить шорткод работать внутри цикла foreach, вызываемого внутри шорткода?

  • 0

Мой плагин WP Coda Slider использует шорткод get_posts и добавляет их в слайдер. Если один из постов содержит шорткод, шорткод в этом посте не будет работать.

$my_wpcodaslider = new wpcodaslider();
class wpcodaslider{

    var $shortcode_name = 'wpcodaslider';
    var $pattern = '<!-- wpcodaslider -->';
    var $posts_content = '';

    function wpcodaslider() {
        add_shortcode( $this->shortcode_name, array( &$this, 'shortcode' ) );
        add_action( 'the_posts', array( &$this, 'wpcodaslider_scripts' ) );
    }

    // insert the shortcode in any page ie: [wpcodaslider id=slidername cat=4 show=3] will show first three post in category with id of 4
    function shortcode( $atts, $content = null ) {
        extract( shortcode_atts( array(
            'cat' => null,
            'id'  =>  null,
            'show' => null,
            'args' => null
        ), $atts ) );

        //Make sure there is a query and name
        if (! $cat || ! $id)
            return 'Could not load slider. Mallformed shortcode.';
    $o = '
        <div class="coda-slider-wrapper">
            <div class="coda-slider preload" id="'. $id .'">';

        $posts = get_posts('post_type=post&order=desc&cat= '. $cat . '&numberposts= ' . $show . '');
        foreach($posts as $post){

            $o.=
            '<div class="panel" id="post-' . $post->ID . '">
                <div class="panel-wrapper">
                    <h2 class="title">' . $post->post_title . '</h2>
                    ' . $post->post_content . '
                </div> <!-- .panel-wrapper -->
            </div><!-- .panel #post-$id -->';
        }


        $o.='
                </div><!-- .coda-slider .preload -->
            </div><!-- coda-slider-wrapper -->

            <script type="text/javascript">
    jQuery(document).ready(function($){
                $().ready(function() {
                    $('#'. $id .'').codaSlider({' . $args .'});
                });
    });
            </script>';


        return $o;
    }

Он также выполняет еще один цикл foreach для проверки своего шорткода перед постановкой скриптов в очередь.

function wpcodaslider_scripts($posts) {


        if (empty($posts)) return $posts;

        $shortcode_found = false; // use this flag to see if styles and scripts need to be enqueued
        foreach ($posts as $post): {
            if (stripos($post->post_content, 'wpcodaslider')) {
                $shortcode_found = true; //shortcode found so lets load the scripts
                break;
            }
        }

        if ($shortcode_found) {
            //enqueue scripts
            wp_enqueue_script('coda_slider', WP_PLUGIN_URL . '/wp-coda-slider/js/coda.slider.js',
            array('jquery'));

            //enqueue style sheet
            wp_enqueue_style('coda_slider', WP_PLUGIN_URL . '/wp-coda-slider/css/coda-slider-2.0.css');
        }

        return $posts;
    }

}

Любые идеи о том, как я могу заставить работать шорткоды в сообщениях? Я протестировал его с помощью шорткода и нескольких других из различных плагинов.

Share
  1. Проблема в том, что вы повторяете необработанное post_content поле из объекта. Это не то, что обычно попадает в интерфейс. Пытаться:

    apply_filters( 'the_content', $post->post_content )
    

    Если вы хотите запускать только шорткоды (без множества других фильтров), вы можете сделать:

    do_shortcode( $post->post_content )
    

    Отредактируйте, перечитайте свой вопрос… Есть ли вероятность, что эта вещь станет рекурсивной? Сообщение, содержащее шорткод слайдера, который вызывает сам себя?

    • 0
  2. Сначала это правильно, использование do_shortcode() поможет. Не уверен насчет apply_filters(), но возможно.

    Если есть проблема с рекурсией, просто отмените регистрацию своего шорткода перед циклом и повторно зарегистрируйте его после этого, чтобы ваш шорткод не оценивался do_shortcode() в цикле. (Или просто взломайте контент, который вы передаете do_shortcode, чтобы удалить текст, соответствующий /[wpcodaslider.*]/ — обратите внимание, что [ и ] должны быть экранированы в регулярных выражениях)

    • 0

Оставить ответ

You must login to add an answer.