区分新 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 );
我正在将本地网站的空缺 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
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 );