Régénérer les limaces du titre des messages


14

est-il possible de régénérer les slugs par programmation après avoir changé les titres de l'article? De nombreux titres de publication ont été mis à jour et le slug n'a pas été mis à jour avec le titre, j'ai donc besoin de régénérer tous ces slugs.


J'ai dû le faire plusieurs fois et j'ai constaté qu'entre différents environnements de serveur où il ne peut pas gérer de grands tableaux (avec des numéros posés sur illimités) ni appeler wp_update_post à plusieurs reprises avec une grande consommation de mémoire, ce qui en un appel WP_Query avec pagination et utilisation $ wpdb qu'il est plus gérable et performant. J'ai fourni l' exemple de code sur un poste similaire .
codearachnid

Réponses:


17

Oui c'est possible.

Un exemple de code doit être testé et affiné:

// get all posts
$posts = get_posts( array (  'numberposts' => -1 ) );

foreach ( $posts as $post )
{
    // check the slug and run an update if necessary 
    $new_slug = sanitize_title( $post->post_title );
    if ( $post->post_name != $new_slug )
    {
        wp_update_post(
            array (
                'ID'        => $post->ID,
                'post_name' => $new_slug
            )
        );
    }
}

Je viens de l'inventer, il y a probablement des erreurs et des cas egde, mais cela devrait vous donner une idée. En outre, cela peut prendre un certain temps, il pourrait donc être utile de diviser la mise à jour en petits morceaux.


1
Hmmm ... d'après mon expérience, cela ne fonctionne pas. L' post_nameargument est ignoré par le wp_update_post, au moins dans la version 3.9 du noyau
Alexandre Bourlier

Actuellement, post_nameest ignoré dans la wp_update_post()fonction, mais il est pris en compte lorsque la publication de mise à jour appelle la wp_insert_post()fonction: cela signifie que le passage du nouveau slug à la mise à jour entraînera une modification efficace pour la publication en cours de mise à jour.
Erenor Paz


1

J'essayais la méthode suggérée par Toscho, qui est "l'instinctive", mais dans de nombreux cas cela ne fonctionne pas (cf. le code de base pour obtenir ce que j'entends par "beaucoup de cas").

En cherchant dans le code, j'ai trouvé le wp_insert_post_datacrochet du filtre, appelé par la wp_update_postfonction juste avant d'insérer le post iunto dans la base de données.

En appelant ce filtre et en modifiant la valeur de $data['post_name'], j'ai pu obtenir que cela fonctionne correctement. Wordpress est cool mais tellement mal documenté ...

J'ai édité la documentation , afin que plus de personnes puissent trouver cette solution si nécessaire.


Pouvez-vous indiquer pourquoi wp_update_post écrase le post_name? la seule raison pour laquelle cela se produit est que si l'utilisateur essayant de modifier le post_name n'est qu'un contributeur (ou même niveau), auquel cas il ne devrait pas autoriser cet utilisateur à changer de slug, avez-vous trouvé d'autres cas dans lesquels le post_name est écrasé?
jnhghy - Alexandru Jantea

Oui, c'est la bonne façon de procéder. Merci @Alexandre
user88731

-1

vous pouvez le faire directement dans mysql si vous en avez besoin. (notre site woocommerce a des centaines de milliers de produits):

update wp_posts set post_name = concat(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(lower(post_title), '"', ''), "'", ''), ",", '-'), " ", '-'), "&", ''), ";", ''), "@", ''), ".", ''), ":", ''), "/", ''), "+", ''), "(", ''), ")", ''), "--", '-'), "---", '-'), "--", '-'), "--", '-'), '-', id) where post_type = 'product';

où post_type = 'product' - qui gardera votre mise à jour uniquement pour les produits de woocommerce; vous devez déterminer les limites que vous souhaitez conserver sur cette requête.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.