web-dev-qa-db-fra.com

Réécriture post-slug avant post-save

Je dois récupérer un champ ACF dans le message et modifier le slug (permalien) du message avant de l'enregistrer dans la base de données. Quelle est l'approche pour y parvenir? J'ai besoin que le slug soit changé à chaque création/édition d'opérations postales.

6
Vit Kos

Ce qui suit doit être pris davantage comme une preuve de concept que comme une solution prête à copier/coller.
Cela étant dit, voici comment procéder:

Le save_postaction s'exécute chaque fois qu'une publication est mise à jour ou créée. Vous pouvez lui associer une fonction de rappel en utilisant add_action .

Par conséquent, votre cas devrait ressembler à ceci:

// initial hook
add_action( 'save_post', 'wpse105926_save_post_callback' );

function wpse105926_save_post_callback( $post_id ) {

    // verify post is not a revision
    if ( ! wp_is_post_revision( $post_id ) ) {

        // unhook this function to prevent infinite looping
        remove_action( 'save_post', 'wpse105926_save_post_callback' );

        // update the post slug
        wp_update_post( array(
            'ID' => $post_id,
            'post_name' => 'some-new-slug' // do your thing here
        ));

        // re-hook this function
        add_action( 'save_post', 'wpse105926_save_post_callback' );

    }
}

Ce qui pourrait être un peu déroutant dans ce qui précède est la déconnexion et la reprise de la fonction en son sein. Cela est nécessaire, car nous appelons wp_update_post pour mettre à jour le slug, ce qui déclenchera à son tour l’action save_post à exécuter à nouveau.

En passant, si vous voulez que WP génère automatiquement le nouveau slug en fonction du titre de l'article, il vous suffit de passer une chaîne vide:

wp_update_post( array(
    'ID' => $post_id,
    'post_name' => '' // slug will be generated by WP based on post title
));
14
Johannes Pille

J'avais besoin de la même chose sauf que seulement pour la post-création.

J'ai implémenté la solutionici(celui-ci est un copier/coller prêt à l'emploi ????).

Supprimez simplement la ligne qui vérifie que les deux dates sont égales, et le slug sera également mis à jour pour les opérations d'édition. Cependant, je ne le recommande pas, car cela changera l'URL du message et que cela n'est pas bon pour le référencement, entre autres choses comme les liens brisés (404).

2
IvanRF