Добавить поле в сообщения (флажок), который может иметь только один пост

Я пытаюсь добавить поле в сообщения WordPress (а не страницы), которые просто включают метку и флажок. Что-то вроде: Сделайте это липким сообщением? Если проверить, ключ должен быть установлен в TRUE или что-то, что легко доступно. Проблема, однако, в том, что я хочу, чтобы только одно сообщение имело значение TRUE. Это означает, что когда я проверил поле в post-1, а затем я проверю это поле в post-2, значение поля post-1 должно быть установлено в FALSE, чтобы только одно сообщение могло иметь TRUE в одно и то же время.

Затем я бы зациклил сообщение в своем index.php, чтобы получить сообщение с значением == ИСТИНА и отобразить его где-то на странице. Что-то вроде этого (не проверено):

$args = array( 'order' => 'DESC', 'posts_per_page' => 1, 'meta_key' => 'post_sticky', ), ); $stickyPost = new WP_Query( $args ); 

В идеале я хочу, чтобы это поле было задано в моем файле functions.php , но из того, что я собрал в Интернете, это не так просто, как должно быть. Вы можете добавлять поля в WordPress самостоятельно, но я не хочу этого делать, потому что я зависим от писателей, и я не хочу, чтобы они возились.

EDIT: видимо, когда ни одна запись не проверяется как подсветка, отображаются 4 сообщения (что равно, насколько я допускаю на индексной странице). Нужно ли мне сбросить данные сообщения основного цикла до вызова этого цикла? Тем не менее, я ожидал бы, что в случае, если есть сообщения, будут исключены любые другие должности, кроме липких. Это код в файле sidebar.php:

 <?php $args = array( 'p' => get_option('my_sticky_post') ); $stickyPost = new WP_Query($args); ?> <?php if($stickyPost->have_posts()) : while($stickyPost->have_posts()) : $stickyPost->the_post(); ?> <aside class="highlight"> <h3>Must-read</h3> <div class="sidebar-content"> <div class="thumbnail"> <?php $image_id = get_post_thumbnail_id(); $image_url = wp_get_attachment_image_src($image_id,'home-featured'); ?> <a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>" style="background-image: url('<?php echo $image_url[0]; ?>');"><span><?php the_title(); ?></span></a> </div> <?php the_excerpt(); ?> </div> </aside> <?php endwhile; ?> <?php endif; ?> <?php wp_reset_postdata(); ?> в <?php $args = array( 'p' => get_option('my_sticky_post') ); $stickyPost = new WP_Query($args); ?> <?php if($stickyPost->have_posts()) : while($stickyPost->have_posts()) : $stickyPost->the_post(); ?> <aside class="highlight"> <h3>Must-read</h3> <div class="sidebar-content"> <div class="thumbnail"> <?php $image_id = get_post_thumbnail_id(); $image_url = wp_get_attachment_image_src($image_id,'home-featured'); ?> <a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>" style="background-image: url('<?php echo $image_url[0]; ?>');"><span><?php the_title(); ?></span></a> </div> <?php the_excerpt(); ?> </div> </aside> <?php endwhile; ?> <?php endif; ?> <?php wp_reset_postdata(); ?> 

EDIT 2: мы можем проверить наличие опции «my_sticky_post». Если он не существует, WP вернет FALSE. Поэтому следующие работы:

 <?php $stickyId = get_option('my_sticky_post'); if ($stickyId) : $args = array( 'p' => $stickyId ); $stickyPost = new WP_Query($args); if($stickyPost->have_posts()) : while($stickyPost->have_posts()) : $stickyPost->the_post(); ?> <aside class="highlight"> <h3>Must-read</h3> <div class="sidebar-content"> <div class="thumbnail"> <?php $image_id = get_post_thumbnail_id(); $image_url = wp_get_attachment_image_src($image_id,'home-featured'); ?> <a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>" style="background-image: url('<?php echo $image_url[0]; ?>');"><span><?php the_title(); ?></span></a> </div> <?php the_excerpt(); ?> </div> </aside> <?php endwhile; // have posts ?> <?php endif; // have posts ?> <?php wp_reset_postdata(); ?> <?php endif; // $stickyId ?> в <?php $stickyId = get_option('my_sticky_post'); if ($stickyId) : $args = array( 'p' => $stickyId ); $stickyPost = new WP_Query($args); if($stickyPost->have_posts()) : while($stickyPost->have_posts()) : $stickyPost->the_post(); ?> <aside class="highlight"> <h3>Must-read</h3> <div class="sidebar-content"> <div class="thumbnail"> <?php $image_id = get_post_thumbnail_id(); $image_url = wp_get_attachment_image_src($image_id,'home-featured'); ?> <a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>" style="background-image: url('<?php echo $image_url[0]; ?>');"><span><?php the_title(); ?></span></a> </div> <?php the_excerpt(); ?> </div> </aside> <?php endwhile; // have posts ?> <?php endif; // have posts ?> <?php wp_reset_postdata(); ?> <?php endif; // $stickyId ?> 

Solutions Collecting From Web of "Добавить поле в сообщения (флажок), который может иметь только один пост"

Надеюсь, я правильно понял ваш вопрос, и я надеюсь, что код ниже помогает.

Сначала вы должны добавить метамокси, чтобы удерживать параметр, который вы хотите добавить в каждый пост, и my_add_sticky_metabox() будет делать это в сочетании с add_meta_boxes действия add_meta_boxes .

На этом этапе вы ничего не печатаете, а говорите WordPress для печати с использованием объявленного обратного вызова ( my_output_sticky_metabox() ) всякий раз, когда отображается экран редактирования Post.

Используя my_output_sticky_metabox() печатается содержимое метабокса, включая проверку того, следует ли проверять и / или отключать ящик.

Наконец, правильное значение сохраняется с помощью функции my_save_sticky_metabox() в сочетании с save_post действия save_post .

 add_action('add_meta_boxes', 'my_add_sticky_metabox'); function my_add_sticky_metabox(){ add_meta_box( 'my_sticky_post_metabox', __('Sticky Post', 'my_text_domain'), 'my_output_sticky_metabox', 'post' ); } function my_output_sticky_metabox($post){ /** Grab the current 'my_sticky_post' option value */ $sp = intval(get_option('my_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('my_sticky_post_metabox', 'my_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="my_sticky_post">'; echo '<input type="checkbox" id="my_sticky_post" name="my_sticky_post" value="' . $post->ID . '" ' . $checked . $disabled . ' />'; echo 'Make this the sticky post?</label>'; /** Let the user know which Post is currently sticky */ switch($sp) : case 0: $message = 'There is currently no Sticky Post.'; break; case $post->ID: $message = 'This Post is the Sticky Post.'; break; default: $message = '<a href="' . get_edit_post_link($sp) . '" title="' . the_title_attribute('before=Edit post \'&after=\'&echo=0') . '">' . get_the_title($sp) . '</a> is the current Sticky Post'; $message.= '<br />You must remove the sticky status from that post before you can make this one sticky.'; endswitch; echo '<p><em>' . $message .'</em></p>'; } add_action('save_post', 'my_save_sticky_metabox'); function my_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['my_sticky_post_metabox_nonce'])) : return; endif; /** Ensure that the nonce is valid */ if(!wp_verify_nonce( $_POST['my_sticky_post_metabox_nonce'], 'my_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['my_sticky_post'])) : // It was... update_option('my_sticky_post', $_POST['my_sticky_post']); // Update the option else : // It was not... /** Check to see if the option was checked prior to the options being updated */ if($_POST['was_checked'] != 0) : // It was... update_option('my_sticky_post', -1); // Set the option to '-1' endif; endif; } 

Теперь, когда вы хотите захватить свой собственный липкий пост, вы используете этот запрос –

 $args = array( 'p' => get_option('my_sticky_post') ); $stickyPost = new WP_Query($args); if($stickyPost->have_posts()) : while($stickyPost->have_posts()) : $stickyPost->the_post(); { Your code goes here } endwhile; endif; wp_reset_postdata(); 

Существует много материалов для чтения, которые я бы посоветовал вам взглянуть сюда, надеюсь, он ответит на любые вопросы, которые могут возникнуть по поводу кода выше –

  • Действие add_meta_boxes
  • Действие save_post
  • Функция add_meta_box()
  • Функция checked()
  • Функция disabled()

редактировать

Вы отмечаете, что если личная запись не задана, у вас есть 4 сообщения на index.php (это ваш стандартный номер).

Я считаю, что это связано p тем, что если параметр p пуст, он игнорируется, поэтому вам нужно проверить значение параметра my_sticky_post .

Внесите это изменение в массив $args (и обратите внимание на дополнительную строку выше) –

 $sticky_id = get_option('my_sticky_post'); $args = array( 'p' => ($sticky_id) ? $sticky_id : '-1' );