1

注:これはおそらく簡単な修正ですが、私は配列の使用に不慣れで、完全に困惑しています。

WordPressのOptionsAPIを介してショートコード配列からデータを保存しようとしています。次に、その配列を呼び出し、そのデータを使用して別の配列を作成し、プラグインの関数にフックします。これはレスポンシブスライダープラグインであり、基本的にショートコードを添付しようとしているので、バックエンドでスライダーを作成し、次のようなショートコードでフロントエンドに表示できます[responsive_slider slider_name="imageslider"]

実装ドキュメントはここにあり、私のコードは次のとおりです。

function responsive_gallery_shortcode($atts, $content=null) {
    extract(shortcode_atts( array('slider_name' => 'product_page') , $atts));
    foreach ($slider_name as $value) {
        update_option('_unique_slider_name', $value );
    }
    if(function_exists('show_flexslider_rotator')) 
        echo show_flexslider_rotator( $slider_name );

    add_image_size( $slider_name , '550', '250', true );
}
add_shortcode('responsive_gallery', 'responsive_gallery_shortcode');        

if (!function_exists('custom_set_flexslider_hg_rotators')) {
    function custom_set_flexslider_hg_rotators() {
        $slider_name = get_option('_unique_slider_name');

        foreach ($slider_name as $value) { 
            $rotators = array();
            $rotators[ $value ] = array( 'size' => $value );    
            return $rotators;
        }   
    }  
} 
add_filter('flexslider_hg_rotators', 'custom_set_flexslider_hg_rotators', 9999);

両方の関数で「foreach()に無効な引数が指定されました」というエラーが発生しforeachます。2つのショートコードがあるページでは、両方のエラーが2回表示されます。$slider_name配列ではなく文字列のように見えますupdate_option()が、配列を返すように関数に保存する方法が必要です。私はアレイにまったく慣れていないので、ここでは間違いなく苦労しています。私はこれに何時間も費やし、WordPress側ですでに少しの助けを受けていますが、私はそれを完全には得ていません。

4

1 に答える 1

1

ショートコード属性は文字列として届くため、最初に配列に変換する必要があります。

同時に、文字列として渡す必要があるため、これを管理できるようにセパレータを使用する必要があります。

そのためには、PHP関数が必要ですexplode

$string = "one,two";
$array = explode( ',', $string );
var_dump( $array );

結果:

array (size=2)
  0 => string 'one' (length=3)
  1 => string 'two' (length=3)

$string = "one";
$array = explode( ',', $string );
var_dump( $array );

結果:

array (size=1)
  0 => string 'one' (length=3)

PS:PHPマニュアルと、その各ページのコメントを参照することは常に価値があります:http ://www.php.net/manual/en/language.types.array.php


[更新]
元のコードには多くの問題があります。この改訂版のコメントを確認してください。

function responsive_gallery_shortcode($atts, $content=null) {
    extract(shortcode_atts( array('slider_name' => 'product_page') , $atts));

    // Convert string into array
    // Using comma as separator when writing the shortcode in the post
    $array_slider = explode( ',', $slider_name );

    // YOU DON'T NEED A `foreach` HERE
    //foreach ($array_slider as $value) {
        update_option('_unique_slider_name', $array_slider );
    //}

    // I DON'T KNOW WHAT THIS FUNCTIONS DOES
    // But in any case, being $array_slider an array, maybe it should be inside a `foreach`
    if(function_exists('show_flexslider_rotator')) 
        echo show_flexslider_rotator( $array_slider );

    // THIS DOESN'T MAKE SENSE
    // You're not supposed to be adding images sizes at each Shortcode call
    // And you are dealing with an array
    add_image_size( $slider_name , '550', '250', true );
}
add_shortcode('responsive_gallery', 'responsive_gallery_shortcode');        

if (!function_exists('custom_set_flexslider_hg_rotators')) {
    function custom_set_flexslider_hg_rotators() {
        // The option was already saved as array, so we can work directly with it
        $slider_name = get_option('_unique_slider_name');

        // YOU DON'T WANT TO DECLARE THE VARIABLE AT EACH STEP OF THE LOOP
        $rotators = array();
        foreach ($slider_name as $value) { 
            $rotators[ $value ] = array( 'size' => $value );    
        }   
        // RETURN THE VALUE ONLY AFTER COMPLETING THE LOOP
        return $rotators;
    }  
    // PUT THE FILTER HOOK INSIDE if(!function_exists())
    add_filter('flexslider_hg_rotators', 'custom_set_flexslider_hg_rotators', 9999);
} 
于 2013-02-27T06:38:12.330 に答える