Использование цикла внутри администратора

У меня есть следующая проблема:

Я создаю custom-meta-box для того, чтобы пользователь мог добавлять пользовательские поля дружественным образом.
Я хочу создать раскрывающийся список со всеми сообщениями, которые подпадают под категорию 10.
Я создал цикл внутри файла функций для получения сообщений, которые я хочу, и для создания списка выпадающего списка.

Поэтому, когда я перехожу к администраторам -> сообщениям и выбираю сообщение для редактирования, я получаю следующую проблему:
последнее сообщение будет загружаться независимо от того, какой я выбираю.

Вот код, используемый внутри файла функций, а затем вызывается при генерации html-кода для настраиваемого мета-поля:

function get_project_ids($proj_cat = 10) { $output = ''; $catt = get_categories('parent='.$proj_cat.'&hide_empty=0'); foreach ($catt as $c) : $output .= '<optgroup label="'.$c->name.'">'; $d = get_categories('parent='.$c->cat_ID.'&hide_empty=0'); foreach ($d as $e) : $output .= '<optgroup label="'.$e->name.'">'; $args = array( 'nopaging' => true, 'cat' => $e->cat_ID ); $project_query = new WP_Query( $args ); while ( $wp_query->have_posts() ) : $wp_query->the_post(); $project_id = (get_post_meta($post->ID, 'project_code', true) != "")?get_post_meta($post->ID, 'project_code', true):""; $output .= '<option value="'.$post->ID.'">'.$project_id.'-'.get_the_title().'</option>'; endwhile; wp_reset_postdata(); $wp_query = null; $wp_query = $original_query; $output .= '</optgroup> <!-- END level-b -->'; endforeach; $output .= '</optgroup> <!-- END level-a -->'; endforeach; return $output; 

Я не уверен в этой проблеме, но мой совет – попробовать и реорганизовать это, чтобы использовать get_posts() и теги шаблонов, которые могут работать без глобальной переменной $post . В принципе, вообще не касайтесь глобалов.

Циклы в интерфейсе сегодня почти цивилизованны, но внутренние админы все еще очень дикие. 🙂

Вы создаете новый запрос, называемый $project_query , а затем никогда не используете его.

Затем вы используете $wp_query , для которого нет global $wp_query; заявление.

Затем вы назначаете null в $wp_query затем присваиваете ему значение неопределенной переменной.

Вместо этого удалите две ненужные строки и вместо этого используйте $project_query . вот модифицированный цикл запросов:

  $args = array( 'nopaging' => true, 'cat' => $e->cat_ID ); $project_query = new WP_Query( $args ); while ( $project_query ->have_posts() ) : $project_query ->the_post(); $project_id = (get_post_meta($post->ID, 'project_code', true) != "")?get_post_meta($post->ID, 'project_code', true):""; $output .= '<option value="'.$post->ID.'">'.$project_id.'-'.get_the_title().'</option>'; endwhile; wp_reset_postdata(); 

Это рабочий код:

 global $post; $tmp_post = $post; $args = array( 'numberposts' => 10000, 'category' => $e->cat_ID ); $myposts = get_posts( $args ); foreach( $myposts as $post ) : setup_postdata($post); $project_id = (get_post_meta($post->ID, 'project_code', true) != "")?get_post_meta($post->ID, 'project_code', true):""; $output .= '<option value="'.$post->ID.'">'.$project_id.'-'.get_the_title().'</option>'; endforeach; $post = $tmp_post; 

Нашел этот вопрос, просмотрел ответы, но должен был сделать комбинацию, потому что я хотел использовать WP_Query, и у меня все еще возникали проблемы в панели управления admin.

Этот код работает правильно для меня в метабоке при редактировании сообщений:

 function custom_metabox() { global $post; $temp_post = $post; $args = array( 'post_type' => 'custom_post_type', 'meta_key' => '_custom_meta_key', 'meta_value' => TRUE ); $custom = new WP_Query( $args ); if ( $custom->have_posts() ) { while ( $custom->have_posts() ) { $custom->the_post(); // ... with access to the data with functions like get_the_ID(), get_the_title(), etc. } wp_reset_postdata(); } $post = $temp_post; // ... the rest of my metabox ... } 

ПРИМЕЧАНИЕ. Без global $post , $temp_post = $post и $post = $temp_post меня все еще $post = $temp_post проблемы с slug, а выдержка была перезаписана. Добавляя эти фрагменты кода, похоже, теперь он работает солидно.