我的问题是,
在数据库中插入新帖子时是否会触发任何过滤器或操作。?
背后的原因是我想在管理员端插入新帖子时在post meta中添加键。
我的行动称为"save_post"
,但在推荐link之后。此动作触发创建并更新帖子。
但我只想在创建帖子而不是在更新时间
答案 0 :(得分:1)
您正在寻找draft_to_publish
。
当帖子从
{old_status}_to_{new_status}
转换为{old_status}
时,系统会执行{new_status}
操作。该操作伴随着$post
对象。
答案 1 :(得分:1)
您可以使用wp_insert_post
,以便在插入后立即获得post_id
,然后您可以使用该meta_key
添加wp_insert_post
。
如果您没有使用action
并希望使用if ( wp_is_post_revision( $post_id ) )
return;
,那么您只需将代码放在下面:
function
这意味着如果您要更新帖子,那么它将从get_post
返回。
<强> EDITED 强>
方法-1 来实现它。
您只需使用add_action('save_post', 'check_for_post_in_database');
function check_for_post_in_database($post_id) {
//check if the post is in the database or not with get_post( $post_id ) == null
if( get_post( $post_id ) == null ) {
//your code to add meta
}
}
//You can do same thing with publish_post
方法检查该帖子是否存在。如下所示:
add_action('publish_post', 'check_for_meta_in_database');
function check_for_meta_in_database($post_id) {
global $wpdb;
$your_meta = get_post_meta($post_id, 'meta_key', true);
if( empty( $your_meta ) && ! wp_is_post_revision( $post_id ) ) {
update_post_meta($post_id, 'meta_key', 'meta_value');
}
}
方法-2 来实现它。
add_action( 'transition_post_status', 'check_transition_and_then_add_meta', 10, 3 );
function check_transition_and_then_add_meta( $new_status, $old_status, $post ) {
if ( ( 'draft' === $old_status || 'auto-draft' === $old_status ) && $new_status === 'publish' ) {
add_post_meta($post->ID, 'your_meta_key', 'your_meta_value');
}
}
但正如你所说,那里有很多元,这个方法会有点长。
方法-3 来实现它。
您可以按 rnevius 建议哪个甚至是我选择的那个。就像:
draft_to_publish
或者您可以使用//as rnevius suggested {$old_status}_to_{$new_status}
add_action( 'draft_to_publish', 'add_meta_when_status_change' );
function add_meta_when_status_change() {
add_post_meta($post->ID, 'your_meta_key', 'your_meta_value');
}
来执行此操作:
public function comments(){
return $this->hasMany('App\Comments', 'post_id', 'id');
}
您可以参考codex了解有关转换后的详细信息。