web-dev-qa-db-ja.com

Add_actionのショートコードコールバック( 'wp_footer')

私はGithubの gMap プラグインを使ってGoogle Mapsのショートコードを作成しようとしています。これについては、それぞれのショートコード用のカスタムインラインスクリプトを、終了本体タグの直前、jQueryおよび他のすべてのスクリプトのロード後にエコーする必要があります。

次のショートコードは機能しますが、すべてのショートコードに対してではなく、インラインスクリプトを1回だけ追加します。 3つの[map]ショートコードを追加するときは、それぞれのショートコードのインラインスクリプト、3つのインラインスクリプトをフッターに追加する必要があります。しかし、それはただ一つのスクリプトを追加するだけです。これは最後のショートコードからのものです。

class map_class
{
    protected static $var = '';

    public static function map_callback($atts) 
    {     
        extract(shortcode_atts(array(
                'address'               => 'Main Street, New York City, United States',
                'zoom'                      => '14'
            ), $atts));

            $id= Rand();

            $script  = '<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>';
            $script .= '<script type="text/javascript">
                                        jQuery(document).ready(function(){
                                            jQuery("#googlemap' . $id . '").gMap({
                                                address: "' . $address . '",
                                                zoom: ' . $zoom . '
                                            });
                                        });
                                    </script>';

        self::$var = $script;

        add_action( 'wp_footer', array ( __CLASS__, 'footer' ), 20 );

                return '<div id="googlemap' . $id . '" class="googlemap" style="height: ' . $height . '"></div>';           
    }

    public static function footer() 
    {
      echo self::$var;
    }

}
add_shortcode( 'map', array ( 'map_class', 'map_callback' ) );

$ scriptは3つのインラインスクリプトをすべて保持していますが、add_actionで$ scriptを呼び出そうとすると、次のようになります。

add_action( 'wp_footer', array ( __CLASS__, $script ), 20 );

次のようなエラーが表示されます。

「最初の引数は有効なコールバックであると期待されています」

私はここでどんな助けにも感謝します。

1
tomyam

ショートコード関数を呼び出すたびに、前のスクリプトvarを現在のバージョンで上書きします。文字列ではなく配列にします。

self::$var[] = $script;

そしてforeachで出力します。

public static function footer() 
{
    foreach( self::$var as $script ){
        echo $script;
    }
}
0
Milo