0

コンテンツ (ショートコードとして使用) を投稿に挿入するプラグインを作成したとします。各投稿のコードをページの下部にプッシュしようとしています。

これは問題なく動作しますが、同じショートコードを使用する複数の投稿があるアーカイブ ページにいる場合、関数名が重複し、フッター コード (activate_flex_slider) が 1 回しか出力されないため、明らかな競合が発生します。

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

私がやろうとしているのは、それぞれの ID を指す複数の 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');
    ?>
4

2 に答える 2

1

したがって、ここでの問題全体は、連続したフックのキューイングが原因です。すべての投稿 ID をコンパイルし、独自の JavaScript ハンドラーを含めて、ページの読み込み時に flex_slider インスタンスを処理するとどうなるでしょうか。ページがアーカイブ ページである場合にのみ、スクリプトをキューに入れます。すべてのカルーセル コンテナに独自のクラスを持たせると、次のようなことができます。

これをページ テンプレート、フッター、またはヘッダーに配置します。場所は問題ではありません (もちろん、一般的なものは独自のもので埋めてください)。

 <?php if (is_archive()) wp_enqueue_script('special_sauce', '/js/special_sauce_location.js', 'jquery_handle'); ?>

そして、これはあなたの special_sauce スクリプト用です。

 <script>
 ( function ($) {
 $('document').ready(function () {
 $('.carousel_container').each( function(i,obj) {
     obj.flexslider();
 });
 });
 })(jQuery);
 </script>

これはまったくテストしていませんが、うまくいくと思います。

于 2012-10-18T00:55:11.717 に答える
0

明らかに、ループ内に関数宣言を持たないのが最善ですが、それができない場合は、これでうまくいくはずです...

<?php
if(function_exists('your_function') == false) {
    function your_function() {
        echo '<p>This is inserted at the bottom</p>';
    }
}
add_action('wp_footer', 'your_function');
?>
于 2012-10-17T21:58:07.530 に答える