区分新 post 与更新 post on save_post 挂钩

Differentiating a new post from updating a post on save_post hook

我正在将本地网站的空缺 post 共享到共享的 SQL 数据库,其他网站也需要能够读取和更新该数据库。

我能够在本地成功创建和更新 posts 并使用 pdo 连接将它们推送到共享数据库,这很好,但是我的 save_post 挂钩有问题,因为它被多次调用(它在创建和更新时触发)。

这会导致重复,因为我有一个 SQL insert 查询和一个 SQL update 查询。我需要能够在第一次插入 only 并且此后的每个操作都是更新。

我不确定 save_post 钩子是否是问题所在(但这似乎是唯一适用的钩子)。我查看了一些检查,但 wp_is_post_revision 并没有阻止重复,显然 $update 参数实际上并不能用于此目的(你会认为它会!)。

在伪代码中,我想这样做:

// function update_or_insert_vacancy( $post_id ) {
    
if (post does not exist) {
   //as well as the usual local creation, INSERT INTO wp_posts (post_name, post_content, post_title, post_excerpt , to_ping , pinged , post_content_filtered) VALUES ... to remote shared database
} else { 
    //exactly as on the local site 
    UPDATE wp_posts SET column1 = value1, column2 = value2...  on remote shared database too
}

// add_action( 'save_post', 'update_or_insert_vacancy' );

所以重申一下,我想复制 wordpress 通常所做的,但将其共享到共享数据库,并允许任何人使用更新空缺的功能。目前,当您单击 'add new' 和单击 'update' 时保存 post 触发器,因此当我只想要一个时,我会创建两个 post。我想将创建与更新分开,但 save_post 似乎不允许这样做。有办法吗?我想让它尽可能类似于通常的工作流程。这就像另一个站点也可以 read/written 空缺的第二个远程副本。即,我希望能够在一个站点上创建空缺自定义 post 类型并在另一个站点上看到它,并且也能够在另一个站点上更新它,就好像它是在该站点上创建的一样。

为了确保共享数据库中没有冲突,我没有使用 id 插入,而是让数据库以编程方式将数字加一。我不想使用 SQL 检查最后一个条目是否存在或进行更新,因为我发现它很快变得混乱且不可靠。这就是为什么我希望有一个 wordpress php 解决方案。

必须有某种方法来区分新 post 和更新 post 以便我可以在每种情况下使用不同的 sql 语句以避免重复?

当插入被调用两次时会发生重复,但更新不会插入新的 post 如果那里没有——我可以使用 post 的 ID已创建更新它。

我希望这是有道理的,谢谢

更新

这个函数非常有用,但是当我更新一个 post 时,它会更新远程数据库中它之前的所有其他 post,所以我需要一个额外的检查来避免这种情况,要么sql 语句中的某些内容或 post 不存在或类似的内容? add post 1 [![添加 post 3][3]][3]。我添加了一个带有 post 标题 'status check' 的 post,更新了它后面的所有内容。然后我添加了 Status Check 1,它做了同样的事情,但正确地变成了 post id 821。我只想要正确的 post 来正确更新它的 post_title。

function insert_update_sql( $post_id, $post, $update ) {


// If an vacancy is being updated
if ( $update ) {
//exactly as on the local site

 $vacancies = get_posts( array( 'post_type' => 'vacancies', 'numberposts'    => -1,));

 $vacancy_title = $vacancies[0]->post_title;

$servername = "*";
$username = "*";
$password = "*";
try {
     $conn = new PDO("mysql:host=$servername;dbname=vacancies", $username, $password);
     // set the PDO error mode to exception
     $conn->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, PDO::ERRMODE_EXCEPTION);

       $sql="
   UPDATE wp_posts

   SET guid = 'a', post_status = 'b', post_name = 'c', post_content = 'd', post_title = '$vacancy_title', post_excerpt = 'f', to_ping = 'g', pinged = 'e', post_content_filtered = 'f';";

  $conn->exec($sql);

  echo "New record created successfully. Last inserted ID is: " ; //can include $last_id;

   } catch(PDOException $e) {
     echo $sql . "<br>" . 'update' . $e->getMessage();
   }

   $conn = null;


} else {

   $servername = "*";
    $username = "*";
    $password = "*";
  try {
        $conn = new PDO("mysql:host=$servername;dbname=vacancies", $username, $password);
        // set the PDO error mode to exception
        $conn->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, PDO::ERRMODE_EXCEPTION);

          $sql="
      INSERT INTO wp_posts (guid, post_status, post_name, post_content, post_title, post_excerpt , to_ping , pinged , post_content_filtered) VALUES ('$the_post_guid','$the_post_status','$the_post_name' , 'EMPTY', '$the_post_title', 'EMPTY', 'EMPTY', 'EMPTY', 'EMPTY');";

   $conn->exec($sql);

    echo "New record created successfully. Last inserted ID is: " ; //can include $last_id;

      } catch(PDOException $e) {
        echo $sql . "<br>" . 'insert' . $e->getMessage();
      }

      $conn = null;


}
}
add_action( 'save_post_vacancies', 'insert_update_sql', 10, 3 );

INSERT INTO t1 (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=c+1;

此处 a = 1 的行更新为 c= c+1

帽子要发生 a 必须有 UNIQUE 约束或者是 PRIMARY KEY

如果您想保留 b 的新值,请使用 b = VALUES(b)

对特定的 post 类型使用 save_post_{$post->post_type} 动作挂钩。更新还有第三个参数。检查下面的代码。

function insert_update_sql( $post_id, $post, $update ) {
    // If an vacancy is being updated
    if ( $update ) {
        //exactly as on the local site 
        UPDATE wp_posts SET column1 = value1, column2 = value2...  on remote shared database too
    } else { 
        //as well as the usual local creation, INSERT INTO wp_posts (post_name, post_content, post_title, post_excerpt , to_ping , pinged , post_content_filtered) VALUES ... to remote shared database
    }
}
add_action( 'save_post_vacancy', 'insert_update_sql', 10, 3 );