Як я можу зберегти безліч масивів вибору за допомогою API налаштувань для сторінки параметрів плагіна?


10

Я думаю, що це може бути більше проблемою з моїм PHP, а не моїм використанням API налаштувань, але я не можу отримати Wordpress для збереження масиву даних для вікна з декількома виділеннями.

Поле з декількома виділеннями відповідає власному метаполю, а параметри вибору - це власні типи публікацій, які відображатимуть це метаполе.

Ось код відображення:

case 'select2':  
        echo "<select id='$id' style='width:15em;height:10em;' class='select$field_class' name='" . $buddha_option_name . "[$id]' multiple>";  
        foreach($choices as $item) {  

            $item = explode("|",$item);  
            $item[0] = esc_html($item[0], 'buddha_textdomain');  

            $selected = ($options[$id]==$item[1]) ? 'selected="selected"' : '';  
            echo "<option value='$item[1]' $selected>$item[0]</option>";  
        } 
        echo "</select>";  
        echo ($desc != '') ? "<br /><span class='description'>$desc</span>" : ""; 
    break;  

$choices тут визначається як "вибір":

$options[] = array(  
    "section" => "custom_meta",  
    "id"      => BUDDHA_SHORTNAME . "_meta_email",  
    "title"   => __( 'Email Meta Box', 'buddha_textdomain' ),  
    "desc"    => __( 'Select post types to have custom email meta box.', 'buddha_textdomain' ),  
    "type"    => "select2",  
    "std"    => print_r($buddha_option_name[$id]),  
    "choices" => array( __('Posts','buddha_textdomain') . "|post", __('Pages','buddha_textdomain') . "|page", __('Faculty/Staff','buddha_textdomain') . "|staff", __('FAQ','buddha_textdomain') . "|faq", __('Documents','buddha_textdomain') . "|docs", __('Courses','buddha_textdomain') . "|courses" )  
);

І код перевірки:

case 'select2': 
                // process $select_values 
                    $select_values = array(); 
                    foreach ($option['choices'] as $k => $v) { 
                        // explode the connective 
                        $pieces = explode("|", $v); 

                        $select_values[] = $pieces[1]; 
                    } 
                // check to see if selected value is in our approved array of values! 
                $valid_input[$option['id']] = (in_array( $input[$option['id']], $select_values) ? $input[$option['id']] : '' ); 
            break; 

В даний час, якщо я виберу більше одного значення з поля мульти-вибору, WP збереже лише одне значення (зазвичай це перше алфавітне значення). Мені це потрібно, щоб зберегти більше одного значення в масиві.

Я думав, що додавання []до кінця [$id]може допомогти, але ні.


Що $id? І навіщо використовувати print_rв контексті призначення?
TheDeadMedic

$idте саме "id" => BUDDHA_SHORTNAME . "_meta_email", що визначено в іншій функції. І я не знаю, чому я print_rтам зробив , не має великого сенсу?
Спартак

Ви змусили це працювати? Аддін []в кінці nameатрибуту мені допоміг. Двічі перевірте атрибут імені. Ви перевіряєте mySQL db, які параметри зберігаються?
Радек

Не пов’язане з вашим запитанням: я вважаю, що ви переплуталися esc_html()і esc_html__()у своєму коді відображення. Перший приймає лише один аргумент; останній приймає другий аргумент, текстовий домен.
Пат J

Відповіді:


1

Отже, схоже, що тут діють дві речі:

echo "<select id='$id' style='width:15em;height:10em;' class='select$field_class' name='" . $buddha_option_name . "[$id]' multiple>";  

Як зазначає @Radek, ви могли б зробити ім'я поля вибору масивом, використовуючи []- наприклад, name="my_option_name[]"- це призведе до того, що поданий $_POST['my_option_name']масив буде вибраним варіантом, який ви можете зберегти.

Уважніший погляд на ваш код змусив мене:

$select_values = array(); 
foreach ($option['choices'] as $k => $v) { 
    // explode the connective 
    $pieces = explode("|", $v); 

    $select_values[] = $pieces[1]; 
} 
// check to see if selected value is in our approved array of values! 
$valid_input[$option['id']] = (in_array( $input[$option['id']], $select_values) ? $input[$option['id']] : '' ); 

Ви коли-небудь зберігаєте одне значення $valid_input[$option['id']]- чи ваш switchвислів у циклі? Якщо так, спробуйте змінити останній рядок на цей:

$valid_input[$option['id']][] = (in_array( $input[$option['id']], $select_values) ? $input[$option['id']] : '' );

Зверніть увагу на []оператора призначення. Коли ви зберігаєте $valid_input, воно має трактувати значення $valid_input[$option['id']]як масив.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.