Por que “get_option” puxa o valor mais antigo em options.php, em vez do valor mais recente, no envio de um formulário?

Eu estou construindo um “plugin” de ordem simples através das funções do meu tema.php. A function atualiza o valor de uma opção em options.php no envio de um formulário. Então, por exemplo, quando “1” é inserido no campo ao lado de uma publicação em um WP_Query, a identificação dessa postagem é enviada para uma opção em options.php chamado “post1”. Portanto, a opção é “post1” e o valor é “1456” (o ID da postagem). Se “2” for inserido no campo, ele envia a ID da postagem para uma opção chamada “post2”. Eu teria pensado que isso era bastante direto.

No início do script, ligo todas as opções de tal forma que

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

e assim por diante, de modo que $posts1 e $posts2 são IDs de posts. Em seguida, puxe isso para uma matriz que, em seguida, entra em um WP_Query . Isto é para que o usuário saiba qual é a ordem atual das postagens.

Abaixo, então, é outro WP_Query que faz toda a magia acima mencionada acima de puxar a ID da postagem na opção, dependendo do número que o usuário seleciona quando o formulário é enviado.

O que eu esperaria é que, após a apresentação do formulário, onde as opções são alteradas (e elas são alteradas, porque eu verifico as opções.php a cada vez), o recarregamento da página apresentaria a lista mais recente acima – como em, com as opções mudadas. No entanto, o que aparece no primeiro WP_Query , que está puxando as opções como acima e enviando-as para a matriz, é que as opções mais antigas estão sendo puxadas pelo script.

Eu pensei que talvez o script ainda estivesse funcionando após a submissão e as opções não tivessem sido alteradas no tempo para carregar a página, então eu coloquei um sleep(10); antes da lista get_option inicial, mas ainda assim, as opções mais antigas são puxadas mesmo após dez segundos.

Se eu atualizar imediatamente a página após o envio original e recarregar a página, as novas opções são puxadas – simplesmente não no envio e recarga original.

Por que é isso, e como posso corrigi-lo? Existem razões pelas quais o script parece estar puxando opções que parecem ser como em cache ou algo assim?

Obrigado pela ajuda.

Para reiterar, estou ciente de que a chamada get_option original está ocorrendo antes do update_option , mas a opção update_option ocorre apenas no envio do formulário, de modo que a página seja recarregada. As novas opções devem ser apresentadas porque a página é recarregada após o update_option ocorrer, mas não. Quero que as opções “antigas” apareçam no carregamento da página inicialmente, para que o usuário possa ver qual a ordem atual das postagens, pode atualizá-las, enviar o formulário, então a página recarrega e elas devem ser apresentadas com as opções que eles acabei de inserir.

Aqui está uma versão simplificada do código (o que percebo é ineficiente e desajeitado, mas não acho que isso possa afetar o problema em questão):

    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 '
    '; $loop_counter = 0; while ( $my_query->have_posts() ) { $my_query->the_post(); $loop_counter++; echo '
  • '.get_the_title() . ''.'
  • ' ; } echo '
'; } else { } wp_reset_postdata(); ?>
array( 'post', 'feature' ), 'posts_per_page' => 25, 'orderby' => 'date', 'post_status' => 'publish', 'post__not_in' => $post_listids ) ); if($my_query->have_posts()) { echo '
    '; $loop_counter = 0; while ( $my_query->have_posts() ) { $my_query->the_post(); $loop_counter++; $this_id = get_the_ID(); echo '
  • ' . get_the_title() . ''.$this_id.'
  • ' ; ${'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 "
    Sorry, posts cannot have the same position. Try again.
    "; $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 '
'; } else { } wp_reset_postdata(); ?>

Solutions Collecting From Web of "Por que “get_option” puxa o valor mais antigo em options.php, em vez do valor mais recente, no envio de um formulário?"

Se a sua chamada update_option é executada depois de atribuir $posts1 e $posts2 , então, é claro, eles manterão o valor “antigo”, mesmo que você sleep para a eternidade;)

Execute a atualização mais cedo ou (re) atribua as variables ​​posteriormente.

 $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] 

Veja como $posts1 fica excluído da atualização?

Assim, o script é executado novamente, e (eu acho) os novos valores da submissão agora devem ser exibidos no topo. Mas são os antigos.

Porque quando um usuário POST é o formulário, o script simplesmente é executado novamente, mas os valores não são atualizados até o final do script. Posso ver o comportamento que você está procurando e confiar em mim, funcionará como pretendido se você colocar a lógica de atualização no início do script.