Множество опций, не выбранных после сохранения

Проблемы:

Сохранение работает, но сохраняет только один из параметров в базе данных после сохранения.

Параметры не отображаются после выбора.

Поле выбора:

<select id="exclude_page_from_cookies" name="exclude_page_from_cookies[]" multiple="multiple"> <?php $pages = get_pages(); foreach ( $pages as $page ) { $title = get_the_title($page); $id = $page->id; ?> <option id="<?php echo $id; ?>" value="<?php echo $title ?>" <?php selected( $title ); ?> > <?php echo $title;?> </option> <?php } ?> </select> 

Функция сохранения:

 if ( isset( $_POST['exclude_page_from_cookies'] ) ) { foreach( $_POST['exclude_page_from_cookies'] as $exclude_page ) { echo $exclude_page; update_option( 'exclude_page_from_cookies', $exclude_page ) ; } } 

Я понимаю, что я уже размещал это в регулярном обмене стеками, но поскольку это WP-документ, я решил, что переведу его сюда 🙂

Прежде всего вам нужно сохранить значение в виде массива, потому что вы хотите, чтобы были выбраны множественные элементы. Функция update_option будет сериализовать массив для вас, поэтому вам нужно всего лишь указать массив элементов. В вашем коде вы сохраняете все элементы, потому что используете тот же ключ exclude_page_from_cookies а не как массив. Вы также должны пометить выбранный элемент как выбранный, чтобы сохранить больше предметов. Выбранная функция требует, чтобы selected и current соответствовал и эхо отобранного тега. Вы сохраняете значение как заголовок, но я рекомендую вам сохранить его как идентификатор страницы, потому что, если у вас есть идентификатор, вы можете легко получить заголовок, используя функцию get_the_title() . Поэтому я обновил вашу функцию сохранения, чтобы принимать массивы:

 $exclude_pages = $_POST['exclude_page_from_cookies']; if( isset( $exclude_pages ) ) { update_option( 'exclude_page_from_cookies', $exclude_pages ); } else { delete_option( 'exclude_page_from_cookies' ); } 

И ваша выбранная разметка поля:

 <select id="exclude_page_from_cookies" name="exclude_page_from_cookies[]" multiple="multiple"> <?php $pages = get_pages(); $exclude = get_option('exclude_page_from_cookies'); foreach ( $pages as $page ) { ?> <option value="<?php echo $page->ID; ?>" <?php echo ( in_array( $page->ID, $exclude ) ? 'selected' : '' ); ?> > <?php echo $page->post_title; ?> </option> <?php } ?> </select>