web-dev-qa-db-fra.com

Comment puis-je insérer automatiquement le contenu de la page en tant que titre?

J'ai un type de message personnalisé sans champ Titre. Ce sont des messages d'état brefs, où seul le contenu compte. Le flux RSS et le lien permanent affichent le titre en tant que brouillon automatique, ce qui n’est pas très utile. Idéalement, il aurait le contenu du message, ou au moins les 10 premiers mots environ.

J'ai essayé cette fonction, mais elle apparaît toujours en tant que brouillon automatique:

add_filter('title_save_pre', 'save_title');
function save_title($my_post_title) {
        if ($_POST['post_type'] == 'servicestatus') :
          $new_title = wp_trim_words( $_POST['content'], $num_words = 10, $more = null )
          $my_post_title = $new_title;
        endif;
        return $my_post_title;
}

add_filter('name_save_pre', 'save_name');
function save_name($my_post_name) {
        if ($_POST['post_type'] == 'servicestatus') :
          $new_name = wp_trim_words( $_POST['content'], $num_words = 10, $more = null )
          $my_post_name = $new_name;
        endif;
        return $my_post_name;
}
1
Jodi Warren

Je pense que save_post action hook est le bon. Peut-être voudrez-vous insérer une vérification si le titre de l'article est déjà défini ($post_object->post_title), car ce code met toujours à jour le titre en fonction du contenu.

add_action( 'save_post', 'save_post_wpse_87921', 10, 2 );

function save_post_wpse_87921( $post_id, $post_object ) 
{
    // Auto save?
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )  
        return;

    // Correct post_type
    if ( 'servicestatus' != $post_object->post_type )
        return;

    $new_title = wp_trim_words( $post_object->post_content, $num_words = 10, $more = '' );

    // Unhook this function so it doesn't loop infinitely
    remove_action( 'save_post', 'save_post_wpse_87921' );

    // Call wp_update_post update, which calls save_post again. 
    wp_update_post( array( 
        'ID' => $post_id,
        'post_title' => $new_title
    ));

    add_action( 'save_post', 'save_post_wpse_87921', 10, 2 );
}
1
brasofilo