Regenerar lesmas do título das postagens

14

é 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.

Nicola Peluchetti
fonte
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.

fuxia
fonte
1
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.
Erenor Paz
2

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) {

Lessan Vaezi
fonte
1

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.

Alexandre Bourlier
fonte
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.

iateadonut
fonte