Скажите, что я создал плагин, который вводит содержание (используемый в качестве 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');
?>
Я перенес бы все это в класс и поместил бы Ваши данные в 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 прежде и все еще имел плагин для shortcodes, лежащего вокруг. Это немного пыльно, но я загрузил его на свою установку dev теперь, когда я столкнулся с этим вопросом, и это все еще работает (и делает так с несколькими ползунками на той же странице), таким образом, вот содержание основного сменного файла:
/**
* 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);
И с этим у Вас было бы несколько экземпляров ползунка, каждого со своим собственным набором аргументов.
$this->data .= $content;
добавляет то, что Вы передаете как аргумент содержания shortcode к внутреннему$data
var, т.е.[my_shortcode content="something"]
, можно хотеть изменить это для конкретного случая, но он действительно производит несколько значений для shortcodes в нескольких сообщениях. – Milo 18.10.2012, 05:18