Intereting Posts

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

Этот отличный ответ Дэвида Гарда позволил мне иметь метабокс 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'); }