Почему «get_option» тянет более старое значение в options.php, а не более новое значение, при подаче формы?

Я создаю простой «плагин» почтового перевода через функции functions.php моей темы. Функция обновляет значение параметра в options.php при отправке формы. Так, например, когда «1» вводится в поле рядом с сообщением в WP_Query, идентификатор этого сообщения отправляется в параметр options.php, называемый «post1». Таким образом, опция «post1» и значение «1456» (идентификатор сообщения). Если в поле введено «2», он отправляет идентификатор сообщения в опцию «post2». Я бы подумал, что это довольно просто.

В начале сценария я вызываю все варианты, такие, что

$posts1 = get_option('post1'); $posts2 = get_option('post2'); 

и т. д., так что $posts1 и $posts2 являются идентификаторами сообщений. Затем я вытаскиваю их в массив, который затем переходит в WP_Query . Это значит, что пользователь знает, что такое текущий порядок сообщений.

Ниже приведен еще один WP_Query который делает все вышеизложенное магическое значение, чтобы вытащить идентификатор сообщения в параметр в зависимости от того, какой номер выбирается пользователем при отправке формы.

То, что я ожидал бы, заключается в том, что при отправке формы, где параметры меняются (и они меняются, потому что я каждый раз проверяю options.php), перезагрузка страницы будет содержать более новый список выше – с измененными параметрами. Однако то, что появляется в первом WP_Query , который втягивает параметры, как указано выше, и отправляет их в массив, заключается в том, что более старые параметры втягиваются скриптом.

Я подумал, возможно, что сценарий все еще работал после отправки, и параметры не были изменены вовремя для загрузки страницы, поэтому я поставил sleep(10); перед стартовым списком get_option , но все же более старые опции вытягиваются даже через десять секунд.

Если я сразу обновляю страницу после первоначальной отправки и перезагрузки страницы, новые параметры втягиваются – просто не на исходную отправку и перезагрузку.

Почему это и как я могу это исправить? Есть ли причины, по которым сценарий, похоже, тянет варианты, которые кажутся похожими на кеширование или что-то еще?

Спасибо за вашу помощь.

get_option , я знаю, что первоначальный вызов get_option происходит до update_option , но update_option возникает только после update_option формы, поэтому страница перезагружается. Новые параметры должны быть представлены, потому что страница перезагружается после update_option , но они этого не делают. Я хочу, чтобы «старые» параметры отображались на начальной странице, поэтому пользователь может видеть, что представляет собой текущий порядок сообщений, может обновлять их, отправлять форму, затем перезагружать страницу, и им должны быть представлены варианты, которые они только что ввели.

Вот упрощенная версия кода (который я понимаю, неэффективен и неуклюж, но я не думаю, что это должно повлиять на проблему):

  <?php function functionpostorderit() { ?> <?php /* THE FIRST LOOP BELOW IS SO USERS CAN SEE THE CURRENT POST ORDER */ global $post; global $my_query; $posts1 = get_option('post1'); $posts2 = get_option('post2'); $posts3 = get_option('post3'); $post_listids = array($posts1,$posts2,$posts3); array_filter($post_listids); $paged_l = 1; $posts_per_page_l = 25; $offset = ( $paged_l - 1 ) * $posts_per_page_l; $ids_to_query_l = array_slice( $post_listids, $offset, $posts_per_page_l ); $my_query = new WP_Query( array('post_type' => array( 'post', 'feature' ), 'post__in' => $ids_to_query_l, 'posts_per_page' => $posts_per_page_l, 'orderby' => 'post__in', 'ignore_sticky_posts' => 1, 'post_status' => 'publish') ); if($my_query->have_posts()) { echo '<ul>'; $loop_counter = 0; while ( $my_query->have_posts() ) { $my_query->the_post(); $loop_counter++; echo '<li>'.get_the_title() . '<input type="text" name="number_of_'.$loop_counter.'" value="" />'.'</li>' ; } echo '</ul>'; } else { } wp_reset_postdata(); ?> <hr /> <form method="post" action=""> <?php global $post; global $my_query; /* THE SECOND LOOP BELOW IS THE ONE IN WHICH USERS PRIMARILY UPDATE THE ORDER */ $my_query = new WP_Query( array('post_type' => array( 'post', 'feature' ), 'posts_per_page' => 25, 'orderby' => 'date', 'post_status' => 'publish', 'post__not_in' => $post_listids ) ); if($my_query->have_posts()) { echo '<ul>'; $loop_counter = 0; while ( $my_query->have_posts() ) { $my_query->the_post(); $loop_counter++; $this_id = get_the_ID(); echo '<li>' . get_the_title() . '<input type="text" name="number_of_'.$loop_counter.'" value="" />'.$this_id.'</li>' ; ${'id_of_' . $loop_counter} = get_the_ID(); $current_id = get_the_ID(); ${'number_of_' . $loop_counter} = $_POST['number_of_' . $loop_counter]; $current_value_input = $_POST['number_of_' . $loop_counter]; if(isset($_POST['submit'])) { $current_number_of = 'number_of_'.$loop_counter; if($current_value_input !== '') { $checking_for_equal = array('number_of_1','number_of_2','number_of_3'); $remove_equal = array_search('number_of_'.$loop_counter, $checking_for_equal); unset($checking_for_equal[$remove_equal]); foreach ($checking_for_equal as &$valued) { $valued = $_POST[$valued]; } if (in_array(${'number_of_' . $loop_counter}, $checking_for_equal)) { if ($has_run !== "true") { echo "<div id='message' class='error'>Sorry, posts cannot have the same position. Try again.</div>"; $has_run = "true"; } } else { if($posts1 == $current_id) { $option = 'post1'; $new_value = ''; update_option( $option, $new_value ); } elseif($posts2 == $current_id) { $option = 'post2'; $new_value = ''; update_option( $option, $new_value ); } elseif($posts3 == $current_id) { $option = 'post3'; $new_value = ''; update_option( $option, $new_value ); } else { } $option = 'post'.${'number_of_' . $loop_counter}; $new_value = ${'id_of_' . $loop_counter}; update_option( $option, $new_value ); } } } } echo '</ul>'; } else { } wp_reset_postdata(); ?> <p><input class="submitter" type="submit" name="submit" value="Update" /></p> </form> <?php } ?> с  <?php function functionpostorderit() { ?> <?php /* THE FIRST LOOP BELOW IS SO USERS CAN SEE THE CURRENT POST ORDER */ global $post; global $my_query; $posts1 = get_option('post1'); $posts2 = get_option('post2'); $posts3 = get_option('post3'); $post_listids = array($posts1,$posts2,$posts3); array_filter($post_listids); $paged_l = 1; $posts_per_page_l = 25; $offset = ( $paged_l - 1 ) * $posts_per_page_l; $ids_to_query_l = array_slice( $post_listids, $offset, $posts_per_page_l ); $my_query = new WP_Query( array('post_type' => array( 'post', 'feature' ), 'post__in' => $ids_to_query_l, 'posts_per_page' => $posts_per_page_l, 'orderby' => 'post__in', 'ignore_sticky_posts' => 1, 'post_status' => 'publish') ); if($my_query->have_posts()) { echo '<ul>'; $loop_counter = 0; while ( $my_query->have_posts() ) { $my_query->the_post(); $loop_counter++; echo '<li>'.get_the_title() . '<input type="text" name="number_of_'.$loop_counter.'" value="" />'.'</li>' ; } echo '</ul>'; } else { } wp_reset_postdata(); ?> <hr /> <form method="post" action=""> <?php global $post; global $my_query; /* THE SECOND LOOP BELOW IS THE ONE IN WHICH USERS PRIMARILY UPDATE THE ORDER */ $my_query = new WP_Query( array('post_type' => array( 'post', 'feature' ), 'posts_per_page' => 25, 'orderby' => 'date', 'post_status' => 'publish', 'post__not_in' => $post_listids ) ); if($my_query->have_posts()) { echo '<ul>'; $loop_counter = 0; while ( $my_query->have_posts() ) { $my_query->the_post(); $loop_counter++; $this_id = get_the_ID(); echo '<li>' . get_the_title() . '<input type="text" name="number_of_'.$loop_counter.'" value="" />'.$this_id.'</li>' ; ${'id_of_' . $loop_counter} = get_the_ID(); $current_id = get_the_ID(); ${'number_of_' . $loop_counter} = $_POST['number_of_' . $loop_counter]; $current_value_input = $_POST['number_of_' . $loop_counter]; if(isset($_POST['submit'])) { $current_number_of = 'number_of_'.$loop_counter; if($current_value_input !== '') { $checking_for_equal = array('number_of_1','number_of_2','number_of_3'); $remove_equal = array_search('number_of_'.$loop_counter, $checking_for_equal); unset($checking_for_equal[$remove_equal]); foreach ($checking_for_equal as &$valued) { $valued = $_POST[$valued]; } if (in_array(${'number_of_' . $loop_counter}, $checking_for_equal)) { if ($has_run !== "true") { echo "<div id='message' class='error'>Sorry, posts cannot have the same position. Try again.</div>"; $has_run = "true"; } } else { if($posts1 == $current_id) { $option = 'post1'; $new_value = ''; update_option( $option, $new_value ); } elseif($posts2 == $current_id) { $option = 'post2'; $new_value = ''; update_option( $option, $new_value ); } elseif($posts3 == $current_id) { $option = 'post3'; $new_value = ''; update_option( $option, $new_value ); } else { } $option = 'post'.${'number_of_' . $loop_counter}; $new_value = ${'id_of_' . $loop_counter}; update_option( $option, $new_value ); } } } } echo '</ul>'; } else { } wp_reset_postdata(); ?> <p><input class="submitter" type="submit" name="submit" value="Update" /></p> </form> <?php } ?> 

Если ваш вызов update_option запускается после того, как вы назначили $posts1 и $posts2 , то, конечно, они будут удерживать «старое» значение, даже если вы sleep на вечность;)

Либо запустите обновление раньше, либо (повторно) назначьте переменные впоследствии.

 $posts1 = get_option( 'post1' ); echo get_option( 'post1' ); // [my_id] echo $posts1; // [my_id] update_option( 'post1', 'foobar' ); echo get_option( 'post1' ); // foobar echo $posts1; // [my_id] 

Посмотрите, как $posts1 остается в стороне от обновления?

Таким образом, сценарий запускается снова, и (я думаю) новые значения из представления теперь должны отображаться вверху. Но это старые.

Потому что, когда пользовательская POST-форма, сценарий просто запускается снова, но значения не обновляются до конца скрипта. Я вижу, как вы себя ведете, и доверяйте мне, он будет функционировать по назначению, если поместить логику обновления в начале сценария.