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.
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.
Réponses:
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.
post_name
argument est ignoré par le wp_update_post
, au moins dans la version 3.9 du noyau
post_name
est 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.
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) {
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_data
crochet du filtre, appelé par la wp_update_post
fonction 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.
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.