WordPress自定义操作/过滤器执行两次


Wordpress custom action / filters is executed twice

我对wp.4.0.1有一个大问题。我为客户制作了一个管理公司软件,一切都基于wordpress功能/插件/动作和东西。

class AppNoteCommand{
    function AppNoteCommand() {
        $this->table_note = 'wp_app_noteCommand';
        $this->table_stock = 'wp_app_products_stock';
        $this->instance = $this;
        add_action( 'saveNoteCommand', array( $this, 'hookSaveNoteCommand'), 10, 4);
        add_action( 'saveNoteCommand', array( $this, 'updatingStock' ), 20, 4);
    }
    function hookSaveNoteCommand( $noteFields, $clientFields, $stockFields, $dbAction ) {
        global $wpdb;
        printr($noteFields);
        if ( $dbAction == 'update' && (int) $noteFields['id'] >0 ) {
            $wpdb->update( $this->table_note, $noteFields, array( 'id' => $noteFields['id']) );
        } else $wpdb->insert( $this->table_note, $noteFields );
    }
    function updatingStock( $noteFields, $clientFields, $stockFields, $dbAction) {
        global $wpdb;
        printr($stockFields);
        if ( $dbAction != 'update' ) {
            foreach ( $stockFields['products'] as $product_id=>$stock ) {
                $wpdb->query("UPDATE {$this->table_stock} SET stock=stock-{$stock} WHERE product_id='{$product_id}' AND location_id='{$stockFields['location_id']}'");
                echo mysql_error()."<br />";
            }
        }
    }
 }

主要问题是操作:保存注意命令谁在我按保存命令时执行两次。第一次执行没问题,但第二次在 MySQL 中生成错误(重复键主)。我不明白为什么wordpress为一个动作注册的单个函数执行两次,我认为这个问题通常在wordpress中。此操作中声明的所有函数将执行两次。

有人可以帮助我解决这个问题,或者告诉我我是否错了什么

它可能执行两次,因为 WP 正在保存两个不同的帖子,这实际上是两次使用您的程序触发操作:

  • 新版本中的帖子作为帖子本身
  • 旧版本的帖子作为修订版

假设是这样,您需要检查传递给调用您的操作的任何内容的 ID 是否是修订版。

我的应用程序与WordPress中的帖子没有任何关系。在其他目录中,具有其他结构。操作 saveNoteCommand 不会在 save_post/update_post 上执行。是否仅在我的脚本中执行自定义操作,并且仅提交 $_POST 数据。