Fill post titles from post content?

All we need is an easy explanation of the problem, so here it is.

I imported over 1000 posts from a Tumblr gallery. All the posts are untitled, but each has a photo and name inside of the post. How do I make take the content of each post and make it the post name?

How to solve :

I know you bored from this bug, So we are here to help you! Take a deep breath and look at the explanation of your problem. We have many solutions to this problem, But we recommend you to use the first method because it is tested & true method that will 100% work for you.

Method 1

Hook into the_post – called when the post is actually used – and fill the title. Be aware the slug has to be changed too.

If you are used not to enter a title, hook into save_post too, and let the same code do this for you.

The code

Download on GitHub

<?php
/**
 * Plugin Name: T5 Lazy Title Updates
 * Description: Fill missing post titles from content when a post is called
 * Plugin URI:
 * Version:     2013.01.08.02
 * Author:      Fuxia Scholz
 * Licence:     MIT
 * License URI: http://opensource.org/licenses/MIT
 */

add_action( 'the_post', 't5_lazy_title_update' );
add_action( 'save_post', 't5_lazy_title_update_save', 10, 2 );

/**
 * Add atitle when the post is called in setup_postdata().
 *
 * @wp-hook the_post
 * @param   object $post
 * @return  void
 */
function t5_lazy_title_update( $post )
{
    if ( ! empty ( $post->post_title )
        and strip_shortcodes( $post->post_title ) === $post->post_title
        )
        return;

    $clean_content = wp_strip_all_tags( $post->post_content, TRUE );
    $clean_content = strip_shortcodes( $clean_content );

    if ( '' === $clean_content )
        return;

    $words = preg_split( "/\s+/", $clean_content, 40, PREG_SPLIT_NO_EMPTY );
    $title = implode( ' ', $words );
    $title = rtrim( $title, '.;,*' );
    $slug  = wp_unique_post_slug(
        sanitize_title_with_dashes( $title ),
        $post->ID,
        $post->post_status,
        $post->post_type,
        $post->post_parent
    );

    wp_update_post(
        array (
            'ID'         => $post->ID,
            'post_title' => $title,
            'post_name'  => $slug
        )
    );

    // $post is passed by reference, so we update this property in realtime
    $post->post_title = $title;
    $post->post_name  = $slug;
}

/**
 * Fill title from post content on save
 *
 * @wp-hook save_post
 * @param   int $post_ID
 * @param   object $post
 * @return  void;
 */
function t5_lazy_title_update_save( $post_ID, $post )
{
    t5_lazy_title_update( $post );
}

Note: Use and implement method 1 because this method fully tested our system.
Thank you 🙂

All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply