Utilisation de save_post pour remplacer le titre du message

16

J'utilise des articles personnalisés, et dans ceux-ci, je n'ai pas besoin du titre.

Cela oblige Wordpress à définir les titres de mes messages sur "Brouillon automatique".

Je voudrais changer la valeur du titre en autre chose, calculée à partir d'autres champs de mon message.

Comment dois-je procéder en utilisant save_post ou un autre moyen?

Tsahi Levent-Levi
la source
Veuillez modifier votre question pour inclure votre register_post_type()appel.
Chip Bennett
Qu'essayez-vous de réaliser exactement? Vous ne voulez pas du tout de titre de publication pour votre CPT ou vous voulez qu'il soit défini à partir d'une valeur de champ personnalisé?
Rutwick Gangurde
1
Je ne le veux pas du tout, mais dans la liste des messages, je ne peux pas le supprimer car je ne pourrai plus modifier les messages. Cela signifie que j'ai besoin d'un moyen de placer un "faux" titre à la place.
Tsahi Levent-Levi
1
Donc, ce que vous voulez vraiment faire, c'est modifier l'écran de gestion des publications, pour afficher différentes colonnes pour votre type de publication personnalisé? Si c'est le cas, cela pourrait être une question plus avantageuse à poser. :)
Chip Bennett
C'est une partie. On pose ce genre de questions "d'impact" car il cherche une réponse pour l'aider à organiser de nombreux aspects d'un projet. Recherche,
création de

Réponses:

16

Cette méthode la plus simple serait de modifier les données au point où elles sont insérées, plutôt que de les mettre à jour par la suite, en utilisant wp_insert_post_dataau lieu de save_post. Cela fonctionne sur la création d'une nouvelle publication ou la mise à jour d'une publication existante sans modification. Il évite également le danger de créer une boucle infinie en se déclenchant à l' update_postintérieur 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.
}
SinisterBeard
la source
10

J'avais exactement le même besoin, alors j'ai écrit cette fonction - qui fonctionne. Modifiez-le selon vos besoins. J'espère que cela t'aides.

// 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 );
Biranit Goren
la source
2

Essayez le filtre 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;
}
Ralf912
la source
1
Cette solution ne permet pas de créer un titre "calculé à partir d'autres champs de mon message" - comme demandé. C'est bien, si vous pouvez générer un titre automatique pour tous les messages de ce type. Mais si vous devez dépendre d'une variable dynamique, cela ne vous aidera pas.
Biranit Goren
1
@Biranit Goren Que signifie "calculé à partir d'autres champs de mon message"? Dans quel champ avez-vous manqué dans l'objet post stocké $post? Veuillez lire la question initiale et les commentaires ci-dessous. Un titre de publication généré automatiquement n'est pas demandé. Seul un faux titre de post (un remplacement pour WordPress "Auto Draft") est nécessaire.
Ralf912
2

Voici une solution qui utilise une variable statique pour empêcher une boucle infinie. Cela vous permet d'appeler en toute sécurité à l' wp_update_post()intérieur d'une fonction qui est accrochée 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' );

Remarque: Pour limiter cette fonctionnalité à un certain type de publication, utilisez le crochet save_post _ {$ post-> post_type} au lieu de save_post.

Kellen Mace
la source