WordPress 2.3 e posts sem categoria

Quando migrei para o WP 2.3 passei todas as categorias para tags/etiquetas, acabando por ficar com os posts todos sem categoria. No WP 2.3 mudaram o esquema das tabelas da base de dados relativos à taxonomia dos posts, para que este seja flexível e suporte vários estilos de indexação, como as categorias ou as etiquetas (ou tags).

Para resolver o problema, e pelo menos ter os posts na categoria default teria que editar no interface do WordPress cada post para lhe atribuir a categoria default (a que no meu caso chamei Blog, mas é irrelevante, basta saber que tem o identificador 1).

Como isso era um pouco (só um cadito) trabalhoso, fui directamente à base de dados tratar do assunto. Actualmente existem 3 tabelas para a taxonomia:

  • wp_terms
  • Define o nome dos termos, no caso mais comum acabará por ser o nome das categorias ou etiquetas, e atribui-lhes um identificador numérico;

  • wp_term_taxonomy
  • Esta tabela define o que cada termo representa: categoria, etiqueta ou outra coisa qualquer;

  • wp_term_relationship
  • Esta tabela associa os termos aos “objectos” que é suposto caracterizarem, seja posts, páginas, etc.

Considerando que a categoria ‘default’ é o termo 1 da tabela wp_terms, que queremos relacionar com cada post:

INSERT INTO wp_term_relationships (object_id,term_taxonomy_id)
SELECT ID, 1 FROM wp_posts
WHERE wp_posts.post_type = 'post'
ON DUPLICATE KEY UPDATE term_taxonomy_id=1

Isto vai adicionar uma entrada na tabela de relações para cada post para a categoria 1, ou seja a default. Para não termos erros (talvez haja forma de ignorar entradas duplicadas, mas não sei ao certo como…) optei por fazer o UPDATE em caso de entradas duplicadas.

Depois há sempre um plugin como o Batch Categories para tratar em massa os posts que agora já aparecem na listagem dado a já terem categoria. 🙂

Publicado por

bluey

Ah e tal, qualquer diferença entre isto e a realidade não é pura coincidência.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

*