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.

Nicola Peluchetti
la source
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.

fuxia
la source
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
2

Ce plugin fait également le travail: http://www.jerrytravis.com/598/wordpress-plugin-to-generate-post-slugs

Cependant, comme il ne le fait que pour les publications qui n'ont pas encore de slug, si vous devez régénérer des slugs, modifiez la ligne suivante dans le plugin:

if ($post->post_name == "") {

par exemple, vous pouvez le changer en:

if (true) {

Lessan Vaezi
la source
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.

Alexandre Bourlier
la source
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.

iateadonut
la source