为什么“GET_OPTION”在提交表单时会在options.php中拉入较旧的值,而不是较新的值?

时间:2014-09-01 作者:Edmund Heaphy

我正在通过我的主题函数构建一个简单的post-order“插件”。php。该函数用于更新选项中选项的值。php提交表单。因此,例如,在WP\\U查询中,当在帖子旁边的字段中输入“1”时,该帖子的ID将发送到options中的一个选项。php称为“post1”。因此,选项是“post1”,值是“1456”(post的ID)。如果在字段中输入“2”,它会将帖子的ID发送到名为“post2”的选项。我认为这是相当简单的。

在脚本的开头,我调用了所有选项

$posts1 = get_option(\'post1\');
$posts2 = get_option(\'post2\');
等等,这样$posts1, 和$posts2 是帖子的ID。然后我将它们拉入一个数组,然后进入一个WP_Query. 这是为了让用户知道帖子的当前顺序。

下面是另一个WP_Query 这就完成了上面提到的所有魔术,根据提交表单时用户选择的数字,将帖子的ID拉到选项中。

我所期望的是,在提交表单时,如果选项发生了更改(而且它们也发生了更改,因为我每次都签入options.php),则重新加载页面时会显示上面的较新列表–如中所示,选项发生了更改。但是,第一个WP_Query, 这就是如上所述拉入选项并将其发送到阵列,即脚本正在拉入较旧的选项。

我原以为脚本在提交后仍在运行,并且选项没有在页面加载时及时更改,所以我将sleep(10); 启动前get_option 列表,但即使在10秒钟后,旧选项仍会被拉入。

如果在原始提交和重新加载页面后立即刷新页面,则会引入新选项,而不是在原始提交和重新加载页面上。

为什么会这样,我如何修复它?是否有理由认为脚本会引入类似缓存之类的选项?

谢谢你的帮助。

重申一下,我知道get_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
    }
    ?>

1 个回复
SO网友:TheDeadMedic

如果您的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 被遗漏在更新之外?

因此,脚本会再次运行,(我认为)提交的新值现在应该显示在顶部。但这是旧的。

因为当用户发布表单时,脚本只是再次运行,但值直到脚本结束才更新。我可以看到您所追求的行为,相信我,如果您将更新逻辑放在脚本的开头,它将按预期运行。

结束

相关推荐

GET_POST()的PHP内存友好替代方案

我遇到了以下内存问题:get_posts( array( \'posts_per_page\' => \'-1\', \'post_type\' => array( \'product\', \'product_variation\' ) )(有数千个结果)只是尝试获取所有帖子ID的列表。下面的代码一次捕获10个产品,希望避免任何内存限制。它似乎工作正常,但可能有一个更优雅的解决方案。https://gist.github.com/dtbaker/acd15e542d98bff68034$pr