Combinar e combinar termos em Taxonomias Diferentes

Tenho alguns nomes de autores em duas diferentes taxonomias onde os termos são formatados de duas maneiras diferentes, mas sobrepostas. Existem cerca de 400 termos em cada taxonomia, associados a aproximadamente 700 postagens. (O motivo de toda essa bagunça é uma migration complicada de uma versão antiga do Expression Engine.)

A primeira taxonomia é apenas tags padrão e, após a mesclagem, vou excluir todos esses termos. O formato é este, sem as citações, onde “123” pode ser um número de três ou quatro dígitos:

“[123] Sobrenome, Primeiro Nome”

A outra taxomia, que eu vou manter, é chamada de autor_tax . Seu formato é mais simples:

“Primeiro nome, ultimo nome”

Claro, eu gostaria de manter todas as associações atuais para as duas taxonomias. Os melhores cenários de casos são os termos são mesclados somente se o primeiro nome e o último coincidir. Mas mesmo apenas combinar o LastName economizaria HORAS de fusão manual. Posso obter algumas correspondências ruins, mas limpar isso seria mais fácil do que uma fusão manual de 400 termos.

Isso é possível ou estou sonhando?

(By the way, estes não são autores tradicionais do WordPress que criariam postagens, mas autores para um site da revista WP-driven. Portanto, nada disso tem nada a ver com as tabelas do usuário).

Solutions Collecting From Web of "Combinar e combinar termos em Taxonomias Diferentes"

Pegue todas as tags de postagem e controle-as. Se for considerado um “autor” por uma combinação de padrões , verifique se o termo equivalente author_tax existe. Caso contrário, crie-o.

Agora você pode criar duas pilhas: uma para termos author_tax para append a postagem, e outra para post_tag ser removida.

 $post_tags = get_the_terms( $post_id, 'post_tag' ); $authors = $remove = array(); foreach ( $post_tags as $post_tag ) { if ( preg_match( '/^\[[0-9]+\] *([^,]+), *(.+)$/', $post_tag->name, $match ) ) { $fullname = "$match[2] $match[1]"; if ( $term = get_term_by( 'name', $fullname, 'author_tax' ) ) // Already exists $authors[] = ( int ) $term->term_id; elseif ( ! is_wp_error( $term = wp_insert_term( $fullname, 'author_tax' ) ) ) // Create new author tax term $authors[] = ( int ) $term['term_id']; $remove[] = ( int ) $post_tag->term_id; } } $authors && wp_set_object_terms( $post_id, $authors, 'author_tax', true /* Append terms */ ); $remove && wp_remove_object_terms( $post_id, $remove, 'post_tag' ); 

Ou destaque este em um loop foreach / while para todas as postagens, ou batch it up. Com 700, você deve poder fugir com uma corrida direta, desde que você possa aumentar o tempo limite .

Este código não é testado. Primeiro backup!

Atualização : uma vez que esta é uma coisa única, basta criar um arquivo import.php na sua pasta de instalação do WordPress e, em seguida, carregar o WordPress na primeira linha:

 require './wp-load.php'; ini_set( 'max_execution_time', 300 ); $posts = get_posts( 'posts_per_page=-1&fields=ids' ); foreach ( $posts as $post_id ) { // Code from above } 

Acerte esse script do seu navegador e aguarde! Eu executaria um teste com apenas uma publicação para começar e verificar tudo funciona.