é 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.
Eu tive que fazer isso várias vezes e descobri que entre diferentes ambientes de servidor, onde ele não pode lidar com matrizes grandes (com número de postagens sendo definido como ilimitado) nem chamando wp_update_post repetidamente com grande consumo de memória, que o divide em uma chamada WP_Query com paginação e usando $ wpdb é mais gerenciável e com melhor desempenho. Forneci o exemplo de código em uma postagem semelhante .
Codearachnid
Respostas:
17
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.
Hummm ... da minha experiência, isso não funciona. O post_nameargumento é ignorado por o wp_update_post, pelo menos na versão 3.9 do núcleo
Alexandre Bourlier
Atualmente, 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.
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_datagancho de filtro, chamado pela wp_update_postfunçã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 indicar por que o wp_update_post substitui o post_name? a única razão que vejo para que isso aconteça é se o usuário que tenta modificar o post_name é apenas um contribuidor (ou mesmo nível), caso em que não deve permitir que o usuário mude de lesma, você encontrou outros casos em que o post_name é substituído?
Jnhghy # Alexandru Jantea
Sim, esta é a maneira correta de fazer isso. Obrigado @Alexandre
user88731 10/17/17
-1
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.
Respostas:
Sim, é possível.
Código de exemplo, deve ser testado e refinado:
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.
fonte
post_name
argumento é ignorado por owp_update_post
, pelo menos na versão 3.9 do núcleopost_name
é ignorado nawp_update_post()
função, mas é levado em consideração quando a postagem de atualização solicita awp_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) {
fonte
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 pelawp_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.
fonte
você pode fazer isso diretamente no mysql, se precisar. (nosso site de woocommerce possui centenas de milhares de produtos):
where post_type = 'product' - que manterá sua atualização apenas para produtos de woocommerce; você deve descobrir quais limites deseja manter nessa consulta.
fonte