您的操作在中触发wp_transition_post_status()
被调用的wp_insert_post()
在动作之前save_post
已触发。save_post
是处理自定义字段的典型操作。ACF也在这方面发挥作用。
基本上,你必须等到ACF完成它的工作,这意味着你必须save_post
优先级>10或更好使用wp_insert_post
之后就是save_post
.
要跟踪post状态转换,可以使用以下简单的»日志«:
<?php
namespace WPSE199070;
class PublishedTransitionLog {
/**
* @type array
*/
private $status_log = [];
/**
* logs a published post id
*
* @wp-hook publish_profile
*
* @param int $post_id
*/
public function published_post( $post_id ) {
$blog_id = get_current_blog_id();
if ( ! isset( $this->status_log[ $blog_id ] ) )
$this->status_log[ $blog_id ] = [];
if ( in_array( $post_id, $this->status_log[ $blog_id ] ) )
return;
$this->status_log[ $blog_id ][] = $post_id;
}
/**
* @param int $post_id
* @return bool
*/
public function post_published( $post_id ) {
$blog_id = get_current_blog_id();
if ( ! isset( $this->status_log[ $blog_id ] ) )
return FALSE;
return in_array( $post_id, $this->status_log[ $blog_id ] );
}
}
class PublishPostHandler {
/**
* @type PublishedTransitionLog
*/
private $log;
public function __construct( PublishedTransitionLog $log ) {
$this->log = $log;
}
/**
* @param int $post_id
* @param \\WP_Post $post
* @param bool $updated
*/
public function update( $post_id, \\WP_Post $post, $updated ) {
if ( ! $this->log->post_published( $post_id ) )
return;
// do your stuff here
}
}
$transition_log = new PublishedTransitionLog;
$handler = new PublisPostHandler( $transition_log );
add_action( \'publish_profile\', array( $transition_log, \'published_post\' ) );
add_action( \'wp_insert_post\', array( $handler, \'update\', 10, 3 ) );
让我解释一下。第一节课,
PublishedTransitionLog
倾听动作
publish_profile
并在内部存储每个博客的每个已发布帖子。它还提供了一种方法来检查之前是否发布过帖子。
第二个类应该提供您的逻辑,并依赖于第一个类。如果这篇文章没有发表,那它什么都不会做。
这样你就可以独立地听两个不同的钩子。