【问题标题】:US allowed States through Woocommerce custom setting page美国允许州通过 Woocommerce 自定义设置页面
【发布时间】:2019-04-28 09:17:54
【问题描述】:

我有一个函数可以获取美国州列表并从中删除我们不向其出售的州。这可以正常工作,并在创建订单、账单和运输状态下拉列表等时从多个区域删除状态。

这是那个函数。

function wc_sell_only_states($states) {

    $states_not_allowed['US'] = array(
        'AL' => __('Alabama', 'woocommerce'),
        'AR' => __('Arkansas', 'woocommerce'),
        'MD' => __('Maryland', 'woocommerce'),
        'MI' => __('Michigan', 'woocommerce'),
        'MO' => __('Missouri', 'woocommerce'),
        'MS' => __('Mississippi', 'woocommerce'),
        'NJ' => __('New Jersey', 'woocommerce'),
        'SC' => __('South Carolina', 'woocommerce'),
        'TX' => __('Texas', 'woocommerce'),
        'VA' => __('Virginia', 'woocommerce'),
        'WV' => __('West Virginia', 'woocommerce'),
        'AA' => __('Armed Forces', 'woocommerce'),
        'AE' => __('Armed Forces', 'woocommerce'),
        'AP' => __('Armed Forces', 'woocommerce'),
        // MANUALLY ADD STATES NOT ALLOWED HERE 'STATE_ABBREVIATION' => __('State_Name', 'woocommerce'),
    );

    foreach ($states['US'] as $key1 => $value) {
        foreach ($states_not_allowed['US'] as $key2 => $value) {
            if ($key1 === $key2) {
                unset($states['US'][$key1]);
            }
        }
    }

    return $states;
}

add_filter('woocommerce_states', 'wc_sell_only_states');

如您所见,当我需要更改状态不允许列表时,我必须手动进入并添加状态。为了让客户端更容易做到这一点,我正在考虑制作一个管理页面,其中包含所有 50 个状态的复选框。我已经创建了页面,但不确定保存数据并将其重新绑定到我的函数中的最佳方法。

我在这里创建管理页面...

function states_admin_page() {
    global $allowed_states;
    add_menu_page( __( 'States', 'states' ), __( 'States', 'states' ), 'edit_posts', 'add_data', 'my_states', 'dashicons-groups', 6 ) ;
}

add_action('admin_menu', 'states_admin_page');

这是我的回调函数...(不工作)

function gemcore_states() {

    if(!empty($_POST)) {
        global $wpdb;
        $table = 'states';
        $data = array('selected' => $_POST['AA']);
        $where = array('code' => 'AA');
        $format = '%d';

        $wpdb->update($table, $data, $format, $where);

        if($success){
            echo 'data has been save' ; 
        }
    }else{
        ?>
        <form method="post">                
            <label>Armed Forces (AA): <input type="checkbox" name="AA" /></label><br />
            <!-- ... the rest of the states -->
            <input type="submit" value="submit">
        </form>
        <?php 
    }  
}

获取复选框值并将它们作为 0 或 1 保存到我的数据库中的最佳方法是什么?然后在我的原始函数 wc_sell_only_states() 中获取这些数据。

【问题讨论】:

    标签: php wordpress woocommerce settings state


    【解决方案1】:

    以下代码将向 Woocommerce 设置添加一个“美国州设置”页面的子菜单条目,其中包含一个包含所有美国州复选框的表单。检查和验证的每个状态都将可用和允许。

    设置数据将作为所有设置保存在wp_options表中。

    代码如下:

    // Add a submenu entry to Woocommerce menu settings
    add_action('admin_menu', 'states_settings_admin_submenu');
    function states_settings_admin_submenu() {
        $states = __( 'Edit states', 'woocommerce' );
        add_submenu_page('woocommerce', $states, $states, 'edit_shop_orders', 'edit', 'wc_states_setting_page');
    }
    
    // The content for the Woocommerce submenu entry  
    function wc_states_setting_page() {
        $states         = array();
        $country_code   = 'US';
    
        include_once WC()->plugin_path() . '/i18n/states/' . $country_code . '.php';
    
        if( isset($_POST['submit_us_states']) ) {
            $new_states = [];
            foreach( $states[$country_code] as $code => $label ){
                $new_states[$code] = isset($_POST[$code]) && $_POST[$code] ? '1' : '';
            }
            update_option( 'allowed_us_states', $new_states );
        }
    
        $allowed = get_option( 'allowed_us_states' );
    
        // Styling
        echo '<style> .us-states li {width: 200px; float:left; display:block;} .us-states {max-width: 600px;} .us-states .button {float: right; margin-right: 135px;} </style>';
    
        // The form
        echo '<form method="post" class="us-states"><h1>'.__("Allowed US States settings").'</h1><ul>';
    
        foreach( $states[$country_code] as $code => $label ){
            $checked = isset($allowed[$code]) && $allowed[$code] ? ' checked="checked"' : '';
            echo '<li><label><input type="checkbox" name="'.$code.'"'.$checked.'> '.$label.'</label></li>';
        }
    
        echo '</ul><br><br><input type="submit" value="submit" name="submit_us_states" class="button alt"></form>';
    }
    
    // Filtering allowed US states
    add_filter('woocommerce_states', 'allowed_us_states' );
    function allowed_us_states( $states ) {
        if( $allowed = get_option( 'allowed_us_states' ) ){
            foreach( $allowed as $code => $boolean ){
                if( ! $boolean )
                    unset($states['US'][$code]);
            }
        }
        return $states;
    }
    

    代码进入您的活动子主题(或活动主题)的 function.php 文件中。经过测试并且有效。

    【讨论】:

    • 我喜欢保存到 wp_options 的想法,而不是我尝试创建新表的想法,代码效果很好。泰!
    • @RiddleMeThis 当然可以 :) ... 对于像这样的 Woocommerce 设置,不需要也不需要自定义表格。
    猜你喜欢
    • 2017-08-03
    • 1970-01-01
    • 2015-09-09
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    • 2016-09-08
    • 1970-01-01
    相关资源
    最近更新 更多