使用save_post替换帖子标题


16

我正在使用自定义帖子,在这些文章中,我不需要标题。

这将导致Wordpress将我的帖子标题设置为“自动草稿”。

我想将标题的值更改为其他值,该值是根据帖子中的其他字段计算得出的。

我该如何使用save_post或其他方式进行操作?


请编辑您的问题以包括您的register_post_type()电话。
Chip Bennett

您到底想达到什么目标?您根本不需要CPT的帖子标题,还是想从自定义字段值中设置标题?
Rutwick Gangurde

1
我一点都不想要它,但是在帖子列表中,我无法将其删除,因为我将无法再编辑帖子。这意味着我需要一种方法来放置某种“假”标题。
Tsahi Levent-Levi 2012年

1
因此,您真正想做的是修改“管理帖子”屏幕,为您的自定义帖子类型输出不同的列?如果是这样,那可能是一个更有益的问题。:)
Chip Bennett

这是一部分。一个人问这样的“影响”问题是因为他寻求答案来帮助他组织一个项目的许多方面。搜索,模板等
e4rthdog

Answers:


16

最简单的方法是使用wp_insert_post_data代替在插入时编辑数据,而不是事后更新数据save_post。这可以在不更改的情况下创建新帖子或更新现有帖子。它还避免了通过update_post在内部触发而创建无限循环的危险save_post

add_filter( 'wp_insert_post_data' , 'modify_post_title' , '99', 1 ); // Grabs the inserted post data so you can modify it.

function modify_post_title( $data )
{
  if($data['post_type'] == 'rating' && isset($_POST['rating_date'])) { // If the actual field name of the rating date is different, you'll have to update this.
    $date = date('l, d.m.Y', strtotime($_POST['rating_date']));
    $title = 'TV ratings for ' . $date;
    $data['post_title'] =  $title ; //Updates the post title to your new title.
  }
  return $data; // Returns the modified data.
}

10

我的需求完全相同,因此我编写了此功能-可以正常工作。根据您的需要进行修改。希望这可以帮助。

// set daily rating title
function set_rating_title ($post_id) {
    if ( $post_id == null || empty($_POST) )
        return;

    if ( !isset( $_POST['post_type'] ) || $_POST['post_type']!='rating' )  
        return; 

    if ( wp_is_post_revision( $post_id ) )
        $post_id = wp_is_post_revision( $post_id );

    global $post;  
    if ( empty( $post ) )
        $post = get_post($post_id);

    if ($_POST['rating_date']!='') {
        global $wpdb;
        $date = date('l, d.m.Y', strtotime($_POST['rating_date']));
        $title = 'TV ratings for ' . $date;
        $where = array( 'ID' => $post_id );
        $wpdb->update( $wpdb->posts, array( 'post_title' => $title ), $where );
    }
}
add_action('save_post', 'set_rating_title', 12 );

2

尝试使用过滤器default_title

add_filter( 'default_title', 'my_default_title', 10, 2 );

function my_default_title( $post_title, $post ){

  $custom_post_type = 'my_awesome_cpt';

  // do it only on your custom post type(s)
  if( $post->post_type !== $custom_post_type )
    return $post_title;

  // create your preferred title here
  $post_title = $custom_post_type . date( 'Y-m-d :: H:i:s', time() );

  return $post_title;
}

1
此解决方案不允许根据要求创建标题“从我的帖子中的其他字段计算”。很好,如果您可以为所有此类帖子生成自动标题。但是,如果您需要依赖某个动态变量,那么这将无济于事。
Biranit Goren 2012年

1
@Biranit Goren“从我帖子中的其他字段计算”是什么意思?您错过了存储在$post哪个post对象中的哪个字段?请阅读下面的初始问题和评论。自动生成后Titel的是没有要求的。只需要一个伪造的帖子标题(代替WordPress“自动草稿”)。
拉尔夫912

2

这是使用静态变量防止无限循环的解决方案。这样,您就可以安全地wp_update_post()在挂钩的函数内部进行调用save_post

function km_set_title_on_save( $post_id ) {

    // Set this variable to false initially.
    static $updated = false;

    // If title has already been set once, bail.
    if ( $updated ) {
        return;
    }

    // Since we're updating this post's title, set this
    // variable to true to ensure it doesn't happen again.
    $updated = true;

    $date           = get_post_meta( $post_id, 'rating_date', true );
    $date_formatted = date( 'l, d.m.Y', strtotime( $date ) );

    // Update the post's title.
    wp_update_post( [
        'ID'         => $post_id,
        'post_title' => 'TV ratings for ' . $date_formatted,
    ] );
}
add_action( 'save_post', 'km_set_title_on_save' );

注意:要将此功能限制为特定的帖子类型,请使用save_post _ {$ post-> post_type} 挂钩而不是save_post。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.