在商店地址部分的Woocommerce常规设置中添加自定义字段

时间:2017-11-18 05:44:14

标签: php wordpress woocommerce settings custom-fields

我想在Woocommerce设置页面添加一个电话号码字段。我可以将字段添加到设置列表中,但它会附加到整个选项卡的底部。理想情况下,我想在常规标签页的商店地址部分添加该字段。

这是我现在正在使用的(裁剪):

add_filter('woocommerce_general_settings', 'woocommerce_add_phone');

function woocommerce_add_phone($settings) {

    $settings[] = array(
        'title'    => 'Phone Number',
        'type'     => 'text',
    );

    $sections[] = array( 'type' => 'sectionend', 'id' => 'store_address' );

    return $settings;

}

我尝试使用array_splice但无法随身携带。

非常感谢任何建议。

3 个答案:

答案 0 :(得分:2)

这可以通过以 woocommerce_store_postcode字段ID 为目标的简单方式完成,以便在正常位置的此常规设置中插入商店电话自定义字段:

add_filter('woocommerce_general_settings', 'general_settings_shop_phone');
function general_settings_shop_phone($settings) {
    $key = 0;

    foreach( $settings as $values ){
        $new_settings[$key] = $values;
        $key++;

        // Inserting array just after the post code in "Store Address" section
        if($values['id'] == 'woocommerce_store_postcode'){
            $new_settings[$key] = array(
                'title'    => __('Phone Number'),
                'desc'     => __('Optional phone number of your business office'),
                'id'       => 'woocommerce_store_phone', // <= The field ID (important)
                'default'  => '',
                'type'     => 'text',
                'desc_tip' => true, // or false
            );
            $key++;
        }
    }
    return $new_settings;
}

代码放在活动子主题(或主题)的function.php文件中,或者放在任何插件文件中。

经过测试和工作......你会得到类似的东西:

enter image description here

答案 1 :(得分:1)

LoicTheAztec代码可以正常工作,但我想找到一种无需循环的解决方案。这是我的版本:

function add_phone_number_settings($settings) {
    // Search array for the id you want
    $key              = array_search('woocommerce_store_postcode', array_column($settings, 'id')) + 1;
    $custom_setting[] = array(
        'title'    => __('Phone Number'),
        'desc'     => __("Enter shop phone number"),
        'id'       => 'woocommerce_store_phone_number',
        'default'  => '',
        'type'     => 'text',
        'desc_tip' => true,
    );

    // Merge with existing settings at the specified index
    $new_settings = array_merge(array_slice($settings, 0, $key), $custom_setting, array_slice($settings, $key));
    return $new_settings;
}
add_filter('woocommerce_general_settings', 'add_phone_number_settings');

答案 2 :(得分:0)

此代码会在“商店地址”部分的邮政编码元素后面添加您的电话号码。我从here借用了拼接功能。

add_filter('woocommerce_general_settings', 'woocommerce_general_settings_add_phone_number');

function woocommerce_general_settings_add_phone_number($settings) {

    $phone_number = array(
        'title'    => __( 'Phone Number', 'woocommerce' ),
        'desc'     => __( 'Add your phone number.', 'woocommerce' ),
        'id'       => 'woocommerce_store_phone_number',
        'default'  => '',
        'type'     => 'text',
        'desc_tip' => false,
    );

    $array_pos = 0;

    foreach ($settings as $key => $value) {
       if ( $value['id'] == 'woocommerce_store_postcode' ) {
            $array_pos = $key;
            break;
       }
    }

    $settings = array_insert( $settings, $phone_number, $array_pos + 1 );

    return $settings;
}

/*
    Array insert
    @array      the array to add an element to
    @element    the element to add to the array
    @position   the position in the array to add the element
 */
if(!function_exists('array_insert')) {
    function array_insert($array, $element, $position) {
        // if the array is empty just add the element to it
        if(empty($array)) {
            $array[] = $element;
        // if the position is a negative number
        } elseif(is_numeric($position) && $position < 0) {
            // if negative position after count
            if(count($array) + $position < 0) {
                $position = 0;
            } else {
                $position = count($array) + $position;
            }
            // try again with a positive position
            $array = array_insert($array, $element, $position);
        // if array position already set
        } elseif(isset($array[$position])) {
            // split array into two parts
            $split1 = array_slice($array, 0, $position, true);
            $split2 = array_slice($array, $position, null, true);
            // add new array element at between two parts
            $array = array_merge($split1, array($position => $element), $split2);
        // if position not set add to end of array
        } elseif(is_null($position)) {
            $array[] = $element;
        // if the position is not set
        } elseif(!isset($array[$position])) {
            $array[$position] = $element;
        }
        // clean up indexes
        $array = array_values($array);
        return $array;
    }
}