web-dev-qa-db-fra.com

Comment auto incrémenter post titre & post champ slug?

J'ai un type de message personnalisé, c'est-à-dire prj et il est nécessaire d'incrémenter automatiquement le post_title (titre) et le post_name (slug) lors de l'enregistrement, la mise à jour, quel que soit le statut du message. problème ..

Il est nécessaire qu’il se comporte exactement comme le champ AutoIncrement dans SQL. Une fois qu’un ID est attribué, il ne doit jamais être répliqué.

Jusqu'ici, j'ai atteint le code mentionné ci-dessous .. mais le problème est qu'il ne s'agit que de mettre en place le titre du message, pas le slug et la fonctionnalité d'incrémentation ne fonctionne pas aussi bien ..

add_filter( 'wp_insert_post_data' , 'odin_prj_title' , '99', 2 );
function odin_prj_title( $data , $postarr )
{
    if( $data['post_type'] == 'prj' ) {
        $last_post = wp_get_recent_posts( '1');
        $last_post_ID = (int)$last_post['0']['ID'];
        $data['post_title'] = 'P0' . ($last_post_ID + 1);
    }
    return $data;
}
1
Hassan Alvi

J'ai compris en utilisant la fonction wp_count_posts, je peux obtenir le dernier nombre total de publications et sauvegarder le titre au moment de l'exécution! Ajout d'un peu de conditions aussi ..

add_filter( 'wp_insert_post_data' , 'odin_prj_title' , 10, 2 );
function odin_prj_title( $data , $postarr )
{
    if( $data['post_type'] == 'prj' && $data['post_status'] != 'publish' ) {
        $count_posts = wp_count_posts('prj');
        $published_posts = $count_posts->publish;
        $data['post_title'] = 'P0' . ($published_posts + 1);
    }
    return $data;
}
1
Hassan Alvi

Je n'ai pas trouvé de solution en utilisant save_post ou un autre filtre de sauvegarde, aussi, comme je n'ai besoin que de faire de même pour le titre, j'ai utilisé le filtre default_title. Cela signifie que cela fonctionne aussi pour les brouillons.

add_filter( 'default_title', 'change_title', 10, 2 );
function change_title( $title, $post ) {
    return 'PO' . $post->ID;
}

Notez qu'ici, j'utilise l'ID de la nouvelle publication créée. Je n'ai donc pas à récupérer $ last_post_id comme vous le faites, et peut-être n'avez-vous pas à le faire non plus si vous le faites comme ceci. N'oubliez pas de vérifier le type de message avant de changer le titre.

Je n'ai pas testé pour faire la même chose avec le slug, mais j'ai remarqué qu'il existe un filtre similaire pour le slug, appelé wp_unique_post_slug. J'espère que cela vous aidera. :)

Edit: voici le filtre de WP Core Code, https://developer.wordpress.org/reference/functions/wp_unique_post_slug/

1
Magnetize