Задать вопрос
The_Lars
@The_Lars

Неадекватно работает PHP скрипт в Wordpress?

Данный скрипт, добавляет в вордпрессе метабокс, но не могу понять, как грамотно сделать в нём чекбоксы.
Вот код, запихните его в function.php.
1. Почему php ругается на foreach?
2. Если сделать 2 чекбокса с разными id, сохраняться будет только один (как у меня в примере).

Код
<?php 
function my_meta_box() {  
	add_meta_box(  
        'my_meta_box', // Идентификатор(id)
        'Настройки записи', // Заголовок области с мета-полями(title)
        'show_my_metabox', // Вызов(callback)
        'post', // Где будет отображаться наше поле, в нашем случае в Записях
        'normal',
        'high');
}  
add_action('add_meta_boxes', 'my_meta_box'); // Запускаем функцию




$meta_fields = array(
	array(
		'label' => 'Первый',
		//'desc' => '48 - 50 RUS',
		'id' => 'One',
		'type' => 'checkbox', // Указываем тип поля.
		'value' => array ('One', 'Two', 'Three')
		),
	array(
		'label' => 'Второй',
		'id' => 'Two',
		'type' => 'checkbox', // Указываем тип поля.
		'value' => array ('One', 'Two', 'Three')
		)

	);



// Вызов метаполей  
function show_my_metabox() {  
global $meta_fields; // Обозначим наш массив с полями глобальным
global $post;  // Глобальный $post для получения id создаваемого/редактируемого поста
// Выводим скрытый input, для верификации. Безопасность прежде всего!
echo '<input type="hidden" name="custom_meta_box_nonce" value="'.wp_create_nonce(basename(__FILE__)).'" />';  

    // Начинаем выводить таблицу с полями через цикл
echo '<table class="form-table">';  



foreach ($meta_fields as $field) {  
        // Получаем значение если оно есть для этого поля 
	$meta = get_post_meta($post->ID, $field['id'], true);  
        // Начинаем выводить таблицу
	echo '<tr> 
	<th><label for="'.$field['id'].'">'.$field['label'].'</label></th> 
	<td>';  
		switch($field['type']) {
		 // Первый
			case 'checkbox':
			foreach ($field['value'] as $value){
				echo '<input type="checkbox" name="One[]" value="'.$value.'" id="One['.$value.']" ';

				// ini_set( 'display_errors', 'Off' );
				foreach($meta as $val){
					if ($val == $value)
						echo ' checked="checked";} />';}
					echo '<label for="One['.$value.']">'.$value.'</label>';
				} break;
				// Второй
				case 'checkbox':
				foreach ($field['value'] as $value){
					echo '<input type="checkbox" name="One[]" value="'.$value.'" id="testing['.$value.']" ';
					ini_set( 'display_errors', 'Off' );

					foreach($meta as $val){
						if ($val == $value)


							echo ' checked="checked";} />';}
						echo '<label for="One['.$value.']">'.$value.'</label>';
					} break;
				}
			}  
			echo '</table>'; 
		}

// Пишем функцию для сохранения
		function save_my_meta_fields($post_id) {  
    global $meta_fields;  // Массив с нашими полями

    // проверяем наш проверочный код 
    if (!wp_verify_nonce($_POST['custom_meta_box_nonce'], basename(__FILE__)))   
    	return $post_id;  
    // Проверяем авто-сохранение 
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)  
    	return $post_id;  
    // Проверяем права доступа  
    if ('page' == $_POST['post_type']) {  
    	if (!current_user_can('edit_page', $post_id))  
    		return $post_id;  
    } elseif (!current_user_can('edit_post', $post_id)) {  
    	return $post_id;  
    }  

    // Если все отлично, прогоняем массив через foreach
    foreach ($meta_fields as $field) {  
        $old = get_post_meta($post_id, $field['id'], true); // Получаем старые данные (если они есть), для сверки
        $new = $_POST[$field['id']];  
        if ($new && $new != $old) {  // Если данные новые
            update_post_meta($post_id, $field['id'], $new); // Обновляем данные
        } elseif ('' == $new && $old) {  
            delete_post_meta($post_id, $field['id'], $old); // Если данных нету, удаляем мету.
        }  
    } // end foreach  
}  
add_action('save_post', 'save_my_meta_fields'); // Запускаем функцию сохранения

?>



PS. Не силён в php.
  • Вопрос задан
  • 203 просмотра
Подписаться 1 Оценить 4 комментария
Пригласить эксперта
Ответы на вопрос 1
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
1. Почему php ругается на foreach?

в какой строке и что пишет? для проверки значения внутри переменной используйте var_dump();
Если сделать 2 чекбокса с разными id, сохраняться будет только один (как у меня в примере).

куда сохранятся? у полей не указано поле name, по которому собственно и определяются значения, возможно у вас одно и то же имя задается для обоих полей.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы