新创建的POST的操作挂钩SAVE_POST-$POST对象数据均为空

时间:2017-11-20 作者:Gavin

创建帖子时,我需要自动生成帖子的PDF版本。问题是,除了post ID之外,global$post对象大部分是空的。我需要获取新创建的post的slug,因为PDF文件的名称需要与页面的slug匹配。

add_action( \'save_post\', \'my_save_post\' );
function my_save_post($post_id) {
    global $post;

    if ( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE ) return;

    $pdf = new PDF();
    $pdf->createPDF( $post );

    // Debug
    print_r( $post );
    die();
}
如果发布新帖子,然后返回并更新帖子,$post变量包含所有正确的数据,但如果是新帖子,则对象为空。我也试过edit_postpost_updated 钩子,但在任何情况下,slug和大多数其他数据都不存在于$post变量中。

*更新的挂钩和结果print_r($post):

add_action( \'save_post\', \'my_save_post\', 10, 3 );
function my_save_post( $post_id, $post, $update ) {
    if ( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE ) return;
    if ( \'auto-draft\' === $post->post_status ) return;

    $pdf = new PDF();
    $pdf->createPDF( $post );

    // Debug
    print_r( $post );
    die();
}
下面是print_r:

WP_Post Object
(
    [ID] => 593
    [post_author] => 1
    [post_date] => 2017-11-20 18:29:36
    [post_date_gmt] => 2017-11-20 18:29:36
    [post_content] => 
    [post_title] => 
    [post_excerpt] => 
    [post_status] => publish
    [comment_status] => closed
    [ping_status] => closed
    [post_password] => 
    [post_name] => 593
    [to_ping] => 
    [pinged] => 
    [post_modified] => 2017-11-20 18:29:36
    [post_modified_gmt] => 2017-11-20 18:29:36
    [post_content_filtered] => 
    [post_parent] => 0
    [guid] => http://localhost:8888/testsite/?post_type=publication&p=593
    [menu_order] => 0
    [post_type] => publication
    [post_mime_type] => 
    [comment_count] => 0
    [filter] => raw
)

1 个回复
最合适的回答,由SO网友:Nathan Johnson 整理而成

第一次save_post 当WordPress创建自动草稿时激发它。看见Why does save_post action fire when creating a new post?

要修复,只需检查$post 变量的post状态为“自动草稿”。

add_action( \'save_post\', \'my_save_post\', 10, 3 );
function my_save_post( $post_id, $post, $update ) {
    if ( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE ) return;
    if( \'auto-draft\' === $post->post_status ) return;
    $pdf = new PDF();
    $pdf->createPDF( $post );
}

结束

相关推荐

如何输出slug中具有特定值的标签

如何输出slug中有“-en”值的标签我有slug,它看起来像“term1 en”、“term1 de”等等。我如何才能正确地只标记那些在其slug中有“en”的标签。这就是我迄今为止所尝试的。$tag = post_tags(); foreach($tag as $tags) { if(strpos($tags->slug, \'-en\') !== false) { echo $tags->name; }};