可以创建新帖子并让标题和插件自动使用帖子的ID吗?

时间:2017-01-03 作者:Jean-Francois Arseneault

对于给定的自定义帖子类型,我希望每次创建新帖子时(通过使用仪表板,单击“添加新”按钮),slug和Title都采用该帖子的ID。

我相信ID只在帖子保存(草稿或发布)时分配,slug只在状态发布时分配。。。那么,我该怎么解释呢?

原因很简单:自定义的帖子类型是匿名的,而帖子ID是我能想到的最简单的方法,但我对其他方法持开放态度。

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

您需要设置ID 对于post_titlepost_name. 你有很多方法。

通常,您的方法是在WordPress中使用过滤器。我只能说wp_insert_post_data 并使用此过滤器的第二个参数获取post id,然后返回第一个参数,其中包含修改后的post_titlepost_name.

另一种选择是使用操作save_postwp_insert_post

它们是用相同的参数定义的。

File: wp-includes/post.php
3496:   /**
3497:    * Fires once a post has been saved.
3498:    *
3499:    * @since 1.5.0
3500:    *
3501:    * @param int     $post_ID Post ID.
3502:    * @param WP_Post $post    Post object.
3503:    * @param bool    $update  Whether this is an existing post being updated or not.
3504:    */
3505:   do_action( \'save_post\', $post_ID, $post, $update );
3506: 
3507:   /**
3508:    * Fires once a post has been saved.
3509:    *
3510:    * @since 2.0.0
3511:    *
3512:    * @param int     $post_ID Post ID.
3513:    * @param WP_Post $post    Post object.
3514:    * @param bool    $update  Whether this is an existing post being updated or not.
3515:    */
3516:   do_action( \'wp_insert_post\', $post_ID, $post, $update );
这可能是您可以开始的地方。请注意,使用wp_update_post 在…的结尾_20170104_02 函数将激发save_post 再次执行操作,因此我们需要删除该操作以从无限循环中逃脱。

如果你想使用wp_insert_post_data 这是不需要的,因为过滤器返回数据。

add_action(\'save_post\', \'_20170104_02\', 10, 3);

function _20170104_02( $post_id, $post, $update ){

    if ( \'cpt\' != $post->post_type) // only for your custom post type cpt
        return;

    if ( wp_is_post_revision( $post_id ) )
        return;

    if ( wp_is_post_autosave( $post_id ) )
        return;

    if ( !( true == $update  && \'publish\' == $post->post_status ) )
        return;

    remove_action( \'save_post\', \'_20170104_02\' );

    $my_post = array(
          \'ID\'           => $post_id,
          \'post_title\'   => $post_id,
          \'post_name\'    => $post_id
    );

    wp_update_post( $my_post );
}