Избегать дублирования имен функций в столбце Post (сценарий WP_Footer)

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

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

Я бы обернул все это в класс и поместил ваши данные в класс 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(); 

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

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, options, whatever). Массив будет выглядеть так:

 $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 do

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

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