$wpdb->INSERT在页面加载时运行多次,但只调用了一次

时间:2017-02-17 作者:gdaniel

我在一个单独的文件上创建了一个php类,我将该文件包含在函数中。php

  • 我初始化了这个类
    1. 这个类还有很多其他功能,其中有一个函数可以实现这一点:

      $data = array(
          \'time\' => date(\'Y-m-d H:i:s\'),
          \'offset\' => 0,
      );
      
      $format = array(
          \'%s\',
          \'%d\'
      );
      
      $wpdb->insert(\'my_custom_table\',$data,$format);
      
      一个页面加载类运行,由于某种原因,我在数据库中得到了2个条目,而不是一个条目。数据是正确的,但我不知道如果只插入一次,为什么会有两个条目。

      在我的类$wpdb->插入只运行一次。我可以测试一下它旁边的任何东西。

      故障排除:

      因此,我删除了$wpdb->在类外插入并直接添加到函数中。php。我注意到$wpdb->insert运行了2次或更多次。

      是什么导致它运行多次?

      不,我没有回路。是的,我知道我不应该在函数中运行它。php,但它只用于测试。

      我发现了类似的问题,但没有很好的答案。

    2 个回复
    SO网友:Nathan Johnson

    如果看不到更多的代码,很难说为什么。因此,如果您有兴趣了解原因,那么我鼓励您分享更多代码。

    如果您只是在寻找一个解决方案,那么下面的方法可能会奏效。(我说可能是因为我不知道,因为我没有你的代码。)我们要做的是确保插入表的代码只执行一次。因为我们要在init 钩子register() 方法将只触发一次,因为init 只开火一次。因此,条件检查实际上是不必要的,但现在我们可以更加肯定地知道,该表只会被添加一次。


    功能。php

    require_once( PATH_TO . \'/class-wpse106269.php\' );
    add_action( \'init\', [ wpse106269::getInstance(), \'register\' ] );
    
    wpse106269级。php

    <?php
    class wpse106269 {
      private static $instance;
      protected $table_already_inserted;
      protected function __construct() {}
      protected function __clone() {}
      protected function __wakeup() {}
    
      public static function getInstance() {
        if( ! isset( self::$instance ) ) {
          self::$instance = new self;
        }
        return self::$instance;
      }
    
      public function register() {
        if( ! $table_already_inserted ) {
          $this->insert_table();
          $this->table_already_inserted = true;
        }
      }
    
      protected function insert_table() {
        //* Insert table here
      }
    
    添加:

    我把它放在了我的函数中。仅激活ACF(免费)的php。init钩子只运行一次。因此,这要么是ACF(pro)的问题,要么是另一个仍然处于活动状态的插件不能很好地与ACF(pro?)配合使用。

    //* Don\'t access this file directly
    defined( \'ABSPATH\' ) or die();
    
    add_action( \'init\', [ new wpse106269(), \'init\' ] );
    
    class wpse106269{
      protected $n = 1;
      public function init() {
        echo $this->n;
        $this->n = 1 + $this->n;
      }
    }
    

    SO网友:Otto

    您很可能有一个插件或主题在页面内容中单独调用WordPress,以执行类似检索CSS或Javascript代码的操作。页面加载,然后样式表或JS从页面内部加载,导致WordPress再次加载。

    或者,您可以使用wp-cron系统,这会导致wp-cron生成,从而在辅助进程中再次加载WordPress(以运行wp-cron操作)。这可能会导致相同的效果,尤其是如果您在短时间内使用wp cron。

    其结果是,WordPress可以出于多种原因加载,并且并非所有原因都是将页面呈现为HTML。所以,任何时候你在WordPress加载中“做某事”,那么你可能不想把它放在init挂钩上,或者你想进行更具体的检查,这样你就不会每次都随意地做那件事。