Intereting Posts
Каков правильный способ перенаправления всего трафика на HTTPS? Заменить «опубликованный на дату» с «измененным на дату» в сообщениях Как показать список сообщений по авторам и категориям? следующий и предыдущий год месяц и день для архивной страницы Скрыть определенные категории из виджета категории как использовать первое сообщение в виде эскиза на wordpress WordPress Widget – сохранение многомерных массивов в $ instance Идентифицируется ли идентификатор элемента меню? Loop не работает на странице single.php Shortcode для входа пользователя в текущий URL Пользовательский виджет с WYSIWYG Разве WP удаляет устаревшие файлы плагинов / тем для обновления плагина / темы? Ссылка на страницу со всеми сообщениями Как удалить весь раздел «Медиа» из главной навигации WordPress, не скрывая его? Как создать настраиваемый шаблон для пользовательской таксономии?

Метабокс одной позиции влияет на другие

Этот отличный ответ Дэвида Гарда позволил мне иметь метабокс sticky (флажок) для сообщений, которые можно было установить (отмечать) только на одном посту в цикле за раз. Если post A имеет этот мета-ящик, тогда B, C … Z не может его проверить. Чтобы иметь возможность проверять флажок в другом сообщении, пользователь должен сначала снять флажок в столбце A, после чего он или она может установить флажок в других ячейках. Это отлично работает само по себе. Тем не менее, я сталкиваюсь с проблемами при использовании других мета-полей (поля ввода текста). У каждого сообщения есть три обменника: sticky упомянутый выше, и два поля ввода текстовых полей и source (другие могут быть добавлены позже).

Предположим, что пост A проверен sticky , значения review и source не имеют значения, они могут быть пустыми даже. Сохранение этого сообщения отлично работает, и я могу изменить значения всех трех мета-полей, как мне заблагорассудится, без каких-либо ошибок или ошибочного поведения. Тем не менее, когда я редактирую source или review любую другую запись, а затем сохраняю эту запись, внезапно sticky текст не отображается в сообщении A. Я не вижу, как эти вещи могут быть связаны. Вот код для трех мета-полей:

 /* * STICKY POSTS * */ function add_sticky_metabox(){ add_meta_box( 'sticky_post_metabox', 'Sticky Post', 'output_sticky_metabox', 'post' ); } add_action('add_meta_boxes', 'add_sticky_metabox'); // Make a post sticky function output_sticky_metabox($post){ /** Grab the current 'my_sticky_post' option value */ $sp = intval(get_option('sticky_post')); /** Check to see if the 'my_sticky_post' option should be disabled or checked for the current Post */ $checked = checked($sp, $post->ID, false); if($sp > 0) : $disabled = (!disabled($sp, $post->ID, false)) ? 'disabled="true"' : ''; else : $disabled = ''; endif; /** Add a nonce field */ wp_nonce_field('sticky_post_metabox', 'sticky_post_metabox_nonce'); /** Add a hidden field to check against in case it is unchecked before save */ $value = ($checked) ? '1' : '0'; echo '<input type="hidden" name="was_checked" value="' . $value . '" />'; /** Output the checkbox and label */ echo '<label for="sticky_post">'; echo '<input type="checkbox" id="sticky_post" name="sticky_post" value="' . $post->ID . '" ' . $checked . $disabled . '>'; echo 'Make highlight?</label>'; /** Let the user know which Post is currently sticky */ switch($sp) : case 0: $message = 'There\'s no highlight.'; break; case $post->ID: $message = 'This post is the highlight!'; break; default: $message = '<a href="' . get_edit_post_link($sp) . '" title="' . the_title_attribute('before=Bewerk bericht \'&after=\'&echo=0') . '">' . get_the_title($sp) . '</a> is currently lit';; endswitch; echo '<p><em>' . $message .'</em></p>'; } function save_sticky_metabox($post_id){ /* * We need to verify this came from our screen and with proper authorization, * because the save_post action can be triggered at other times. */ /** Ensure that a nonce is set */ if(!isset($_POST['sticky_post_metabox_nonce'])) : return; endif; /** Ensure that the nonce is valid */ if(!wp_verify_nonce( $_POST['sticky_post_metabox_nonce'], 'sticky_post_metabox')) : return; endif; /** Ensure that an AUTOSAVE is not taking place */ if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) : return; endif; /** Ensure that the user has permission to update this option */ if(!current_user_can('edit_post', $post_id)) : return; endif; /** * Everything is valid, now the option can be updated */ /** Check to see if the 'my_sticky_post' option was checked */ if(isset($_POST['sticky_post'])) : // It was... update_option('sticky_post', $_POST['sticky_post']); // Update the option else : // It was not... /** Check to see if the option was checked prior to the options being updated */ if(isset($_POST['was_checked'])) : // It was... update_option('sticky_post', 0); // Set the option to '0' endif; endif; } add_action('save_post', 'save_sticky_metabox'); /* * Source * */ function add_source_metabox(){ add_meta_box( 'source_post_metabox', 'Bron', 'output_source_metabox', 'post' ); } add_action('add_meta_boxes', 'add_source_metabox'); function output_source_metabox($post){ wp_nonce_field('source_post_metabox', 'source_post_metabox_nonce'); $post_source = $post->post_source; echo '<label for="source_post">'; echo '<input type="text" id="source_post" name="source_post" value="'.$post_source.'" style="width: 80%;max-width: 720px;">'; echo ' Add a source to your post.</label>'; echo '<p>Eg <em>http://tweakers.net/nieuws/101372/ing-belgie-wil-betalingsgedrag-van-klanten-meer-gebruiken-voor-dienstverlening.html</em></p>'; } function save_source_metabox($post_id){ /* * We need to verify this came from our screen and with proper authorization, * because the save_post action can be triggered at other times. */ /** Ensure that a nonce is set */ if(!isset($_POST['source_post_metabox_nonce'])) : return; endif; /** Ensure that the nonce is valid */ if(!wp_verify_nonce( $_POST['source_post_metabox_nonce'], 'source_post_metabox')) : return; endif; /** Ensure that an AUTOSAVE is not taking place */ if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) : return; endif; /** Ensure that the user has permission to update this option */ if(!current_user_can('edit_post', $post_id)) : return; endif; // Update and save the field so it can be used in our template if ( isset( $_POST['source_post'] ) ) { $data = sanitize_text_field( $_POST['source_post'] ); update_post_meta( $post_id, 'post_source', $data ); } } add_action('save_post', 'save_source_metabox'); /* * Reviews name field * */ function add_review_metabox(){ add_meta_box( 'review_post_metabox', 'Review', 'output_review_metabox', 'post' ); } add_action('add_meta_boxes', 'add_review_metabox'); function output_review_metabox($post){ wp_nonce_field('review_post_metabox', 'review_post_metabox_nonce'); $post_review = $post->post_review; echo '<label for="review_post">'; echo '<input type="text" id="review_post" name="review_post" value="'.$post_review.'" style="width: 80%;max-width: 720px;">'; echo ' Add the name of the reviewed product.</label>'; echo '<p>Eg <em>Lumia 930</em></p>'; } function save_review_metabox($post_id){ /* * We need to verify this came from our screen and with proper authorization, * because the save_post action can be triggered at other times. */ /** Ensure that a nonce is set */ if(!isset($_POST['review_post_metabox_nonce'])) : return; endif; /** Ensure that the nonce is valid */ if(!wp_verify_nonce( $_POST['review_post_metabox_nonce'], 'review_post_metabox')) : return; endif; /** Ensure that an AUTOSAVE is not taking place */ if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) : return; endif; /** Ensure that the user has permission to update this option */ if(!current_user_can('edit_post', $post_id)) : return; endif; // Update and save the field so it can be used in our template if ( isset( $_POST['review_post'] ) ) { $data = sanitize_text_field( $_POST['review_post'] ); update_post_meta( $post_id, 'post_review', $data ); } } add_action('save_post', 'save_review_metabox'); 

Поэтому при сохранении одного сообщения это влияет на ценность sticky других. Но я не понимаю, как и почему это происходит. Есть предположения?

Solutions Collecting From Web of "Метабокс одной позиции влияет на другие"

Проблема здесь – небольшая ошибка в коде origianl.

В нижней части обратного вызова save_sticky_metabox() измените строку –

 if(isset($_POST['was_checked'])) : 

К этому –

 if($_POST['was_checked'] != 0) : 

Значение was_checked выводится из скрытого поля, а не из флажка, поэтому независимо от значения, которое оно всегда будет установлено. Поэтому нам нужно проверить, не является ли это значение не равным 0 , а не просто проверять, было ли оно установлено.

Несколько советов для вас также –

  1. Вы должны alwasy избегать цитаты и апостопа персонажей в строках –
    • Правильно – «Там нет подсветки».
    • Неправильно – «Нет подсветки». (это вызовет ошибку PHP)
  2. Когда вы создаете 2x поля postmeta, подумайте о начале метаки с помощью _ ( '_post_source' и '_post_review' ). Это означает, что postmeta будет «скрыта» и не будет отображаться в поле « Пользовательские поля» на странице редактирования сообщений.
  3. Если вы хотите, вы можете добавить все 3 обменных ящика через один обратный вызов, а не по одному для каждого (но это личное предпочтение, ничего плохого в том, чтобы делать это по-вашему)

На всякий случай вы хотите это сделать –

 function add_post_metaboxs(){ add_meta_box('sticky_post_metabox', 'Sticky Post', 'output_sticky_metabox', 'post'); add_meta_box('source_post_metabox', 'Bron', 'output_source_metabox', 'post'); add_meta_box('review_post_metabox', 'Review', 'output_review_metabox', 'post'); }