é possível regenerar as lesmas programaticamente depois de alterar os títulos do post? Vários títulos de post foram atualizados e a lesma não foi atualizada com o título, portanto, preciso regenerar todas essas lesmas.
é possível regenerar as lesmas programaticamente depois de alterar os títulos do post? Vários títulos de post foram atualizados e a lesma não foi atualizada com o título, portanto, preciso regenerar todas essas lesmas.
Respostas:
Sim, é possível.
Código de exemplo, deve ser testado e refinado:
// 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
)
);
}
}
Acabei de inventar, provavelmente existem alguns erros e casos de egde, mas isso deve lhe dar uma idéia. Além disso, isso pode demorar um pouco, portanto pode ser útil dividir a atualização em partes menores.
post_name
argumento é ignorado por o wp_update_post
, pelo menos na versão 3.9 do núcleo
post_name
é ignorado na wp_update_post()
função, mas é levado em consideração quando a postagem de atualização solicita a wp_insert_post()
função: isso significa que a passagem do novo slug para a atualização resultará em uma alteração efetiva para a postagem que está sendo atualizada.
Este plugin também faz o trabalho: http://www.jerrytravis.com/598/wordpress-plugin-to-generate-post-slugs
No entanto, como o faz apenas para posts que ainda não possuem uma lesma, se você precisar regenerar lesmas, edite a seguinte linha no plug-in:
if ($post->post_name == "") {
por exemplo, você pode alterá-lo para:
if (true) {
Eu estava tentando o método sugerido por Toscho, que é o "instintivo", mas em muitos casos não funciona (consulte o código principal para entender o que quero dizer com "muitos casos").
Procurando no código, encontrei o wp_insert_post_data
gancho de filtro, chamado pela wp_update_post
função logo antes de inserir a postagem no banco de dados.
Ao chamar esse filtro e alterar o valor de $data['post_name']
, eu consegui fazer com que isso funcionasse corretamente. Wordpress é legal, mas tão mal documentado ...
Eu editei a documentação , para que mais pessoas possam encontrar essa solução alternativa, se necessário.
você pode fazer isso diretamente no mysql, se precisar. (nosso site de woocommerce possui centenas de milhares de produtos):
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';
where post_type = 'product' - que manterá sua atualização apenas para produtos de woocommerce; você deve descobrir quais limites deseja manter nessa consulta.