Предотвращение Дублирующихся имен функций в Цикле Сообщения (сценарий WP_Footer)

Скажите, что я создал плагин, который вводит содержание (используемый в качестве shortcode) в сообщение. Я пытаюсь требовать у того кода каждое сообщение к концу страницы.

Это хорошо работает, однако когда Вы находитесь на странице архива с несколькими сообщениями с помощью того же shortcode, существует очевидный конфликт, потому что имена функций становятся дубликатом, и это только произведет код нижнего колонтитула (activate_flex_slider) однажды.

<?php
function your_function() {
    echo '<p>This is inserted at the bottom</p>';
}
add_action('wp_footer', 'your_function');
?>

То, что я пытаюсь сделать, является выходным сценарием нижнего колонтитула так, чтобы было несколько экземпляров jQuery, указывающих на их соответствующий идентификатор...

<?php
    function flex_slider() {
        $output ='<ul class="flexslider"><li>Slide Content</li></ul>';
        return $output;
    }


    function activate_flex_slider(){
        ?>
    <script>
                ( function ($) {
             $(window).load(function(){

       //different number will be prepended to ID (matches post ID #)
      $('#carousel-<?php echo $post->ID ?>').flexslider();
    });
        })(jQuery);
    </script>
<?php
    }

    // Hook into footer so slider becomes active after page loads
    add_action('wp_footer','activate_flex_slider');

    // Create the Shortcode
    add_shortcode('flex_slider', 'flex_slider');
    ?>
1
18.10.2012, 01:39
2 ответа

Я перенес бы все это в класс и поместил бы Ваши данные в var класса.

class WPA69616_Plugin {
    private $data = '';

    public function __construct() {
        add_shortcode('my_shortcode', array($this, 'add_content'));
        add_action('wp_footer', array($this, 'output_content'));
    }

    public function add_content($atts) {
        extract( shortcode_atts( array(
            'content' => ''
        ), $atts ) );
        $this->data .= $content;
    }

    public function output_content() {
        echo $this->data;
    }
}
$wpa69616_plugin = new WPA69616_Plugin();  
2
19.02.2020, 22:49
  • 1
    Зарегистрируйте действие нижнего колонтитула позже, в shortcode обратном вызове, чтобы не выполнять его, когда никакой shortcode не будет использоваться. полосы –  fuxia♦ 18.10.2012, 01:04
  • 2
    Это все еще только производит содержание нижнего колонтитула в 1 раз, даже когда на странице архива с несколькими сообщениями, содержащими shortcode. –  Joe 18.10.2012, 04:06
  • 3
    @Joe - в этом примере строка $this->data .= $content; добавляет то, что Вы передаете как аргумент содержания shortcode к внутреннему $data var, т.е. [my_shortcode content="something"], можно хотеть изменить это для конкретного случая, но он действительно производит несколько значений для shortcodes в нескольких сообщениях. –  Milo 18.10.2012, 05:18

Я использовал Flexslider прежде и все еще имел плагин для shortcodes, лежащего вокруг. Это немного пыльно, но я загрузил его на свою установку dev теперь, когда я столкнулся с этим вопросом, и это все еще работает (и делает так с несколькими ползунками на той же странице), таким образом, вот содержание основного сменного файла:

Flexslider с WP Shortcodes

/**
 * Holds the URL
 *
 * @since 1.0
 */
if ( ! defined( 'WPSE69616_RELPATH' ) )
    define( 'WPSE69616_RELPATH', plugin_dir_url( __FILE__ ) );

if ( ! class_exists( 'WPSE69616_SLIDER' ) ) :
class WPSE69616_SLIDER {

    /**
     * Scripts & Styles
     *
     * @since 1.0
     */
    public function init() {
        /* default flexslider stylesheet */
        wp_register_style( 'wpse69616-default', WPFS_RELPATH . 'css/flexslider.css', false, '1.8' );
        /* few fixes for WP */
        wp_register_style( 'wpse69616-fixes', WPFS_RELPATH . 'css/fixes.css', false, '1.0' );
        /* the actual slider */
        wp_register_script( 'wpse69616-flexslider', WPFS_RELPATH . 'js/jquery.flexslider-min.js', array('jquery'), '1.8', true );
        /* slider initialization */
        wp_register_script( 'wpse69616-flex-init', WPFS_RELPATH . 'js/initialization.js', array('wpse69616-flexslider'), '1.0', true );
    }

    /**
     * Slider Shortcodes
     *
     * @since 1.0
     */
    public function slider( $atts, $content='' ) {
        wp_enqueue_style( 'wpse69616-default' );
        wp_enqueue_style( 'wpse69616-fixes' );
        wp_enqueue_script( 'wpse69616-flexslider' );
        wp_enqueue_script( 'wpse69616-flex-init' );
        extract( shortcode_atts( array(
            'id' => ''
        ), $atts ) );
        $id = ! empty( $id ) ? ' id="' . $id . '"' : '';
        $content = do_shortcode( $content );

        return '<div' . $id . ' class="flexslider">' .
                '<ul class="slides">' . $content . '</ul>' .
            '</div>';
    }
    public function slide( $atts, $content='' ) {
        $content = do_shortcode( $content );
        return '<li>' . $content . '</li>';
    }

    /**
     * Class Constructor
     *
     * @since 1.0
     */
    public function __construct() {
        add_action( 'wp_loaded', array( &$this, 'init' ) );
        add_shortcode( 'slide', array( &$this, 'slide' ) );
        add_shortcode( 'flexslider', array( &$this, 'slider' ) );
    }

} // class
endif; // class exists

$wpse69616_slider = new WPSE69616_SLIDER();

В этом плагине я инициализирую все ползунки с теми же свойствами, таким образом, для initialization.js выше

jQuery(window).load(function() {
    jQuery('.flexslider').flexslider( {
        slideshow: false,
        controlNav: true,
        prevText: "<",
        nextText: ">",
    });
});

будет достаточен.

Обратите внимание, что Вам только нужны несколько функций jQuery, если Вы хотите использовать ползунок с различными свойствами каждый раз. Иначе можно быть нацелены на всех них при помощи класса как селектор (как сделан выше).

Переменные свойства

Если бы у Вас должны быть переменные свойства, это - то, как это было бы сделано (я предположу, что у Вас есть массив свойств от где-нибудь - postmeta, опции, безотносительно). Массив был бы похож на это:

$slider_properties = array(
    array(
        'id' => 53 // some post ID
        'slideshow' => 'false',
        'controlNav' => 'true'
    ),
    array(
        'id' => 101 // some post ID
        'slideshow' => 'true',
        'controlNav' => 'false'
    )
);

И затем Вы могли добавить

wp_localize_script( 'wpse69616-flex-init', 'wpseSlider', $slider_properties );

к основному сменному классу и что касается js делают

(function($) {
    $(window).load(function() {
        for( var i=0; i<wpseSlider.length; i++ ) {
            $( '#carousel-' + wpseSlider[i].id ).flexslider( {
                slideshow: wpseSlider[i].slideshow,
                controlNav: wpseSlider[i].controlNav,
                prevText: "<",
                nextText: ">",
            });
        }
    });
})(jQuery);

И с этим у Вас было бы несколько экземпляров ползунка, каждого со своим собственным набором аргументов.

1
19.02.2020, 22:49

Теги

Похожие вопросы