【问题标题】:Differentiating a new post from updating a post on save_post hook将新帖子与更新 save_post 挂钩上的帖子区分开来
【发布时间】:2021-04-10 15:27:11
【问题描述】:

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

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

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

我不确定 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 通常所做的,但将其共享到共享数据库,并允许任何人更新空缺的功能。目前,当您单击“添加新”和单击“更新”时保存帖子触发器,所以当我只想要一个时,我会创建两个帖子。我想将创建与更新分开,但 save_post 似乎不允许这样做。有办法吗?我想让它尽可能类似于通常的工作流程。这就像另一个站点也可以读取/写入的空缺的第二个远程副本。即,我希望能够在一个站点上创建一个空缺自定义帖子类型并在另一个站点上看到它,并且也能够在另一个站点上对其进行更新,就好像它是在那个站点上创建的一样。

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

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

两次调用插入时会发生重复,但如果没有新帖子,则更新不会插入新帖子——我可以使用已经创建的帖子的 ID 来更新它。

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

更新

这个函数非常有效,但是当我更新一个帖子时,它会更新远程数据库中之前的所有其他帖子,所以我需要额外检查以避免这种情况,要么是 sql 语句中的某些内容,要么是 post 没有存在或类似的东西? add post 1[![添加帖子 3][3]][3]。我添加了一个帖子标题为“状态检查”的帖子,它更新了它背后的所有内容。然后我添加了 Status Check 1,它做了同样的事情,但正确地变成了 post id 821。我只想要正确的帖子来正确更新它的 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 );

【问题讨论】:

    标签: php mysql wordpress pdo hook


    【解决方案1】:

    对特定的帖子类型使用save_post_{$post-&gt;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 );
    

    【讨论】:

    • 确实如此,非常感谢,谢谢
    • --我唯一注意到的是,当我更新一篇文章时,所有以前的文章都会被远程表中的新数据覆盖?
    • 请更新您的问题并添加您正在尝试的查询。
    • 谢谢,我已经在更新下添加了
    • 其实我想我已经用更具体的SQL查询解决了,谢谢
    【解决方案2】:

    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)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-03
      • 1970-01-01
      • 1970-01-01
      • 2018-08-01
      • 2022-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多