Register

💻 Tecnologia - September 8, 2018

Comandos SQL úteis para WordPress

Atuar diretamente no banco de dados do WordPress pode trazer grandes benefícios, facilidades para configuração e manutenção de um projeto. Caso você esteja em meio a uma migração de servidores, seja troca de serviço de hospedagem ou publicação do WordPress em ambiente de produção; podemos executar algumas queries para facilitar o seu trabalho.

Por outro lado, se você está com o site bem estabelecido, não pretende mudar o serviço de hospedagem, mas precise aprimorar a performance de sua instalação WordPress, conte com essas outras consultas para te auxiliar nesse processo.

Manutenção e Gerenciamento com instruções SQL

Modificar tipos de posts

Quando você executa a troca de Temas em seu projeto, pode ocorrer de alguns tipos de posts se perderem durante o processo. Nessa situação você pode optar por personalizar os códigos do novo tema a fim de registrar, tratar e exibir o tipo de post antigo; ou então simplesmente modificar o tipo de post para um outro que exista e já esteja amparado pelo novo tema.

UPDATE 'wp_posts' SET post_type = 'post' WHERE 'post_type' = 'outro-tipo'

Alterar o nome do usuário (user_login)

Uma vez criado um utilizador, o WordPress impossibilita a alteração do login do mesmo. Isso é feito para garantir que não existam conflitos e outras questões de segurança. O fato é que se você precisa mesmo fazer essa alteração e está certo que o novo nome não está em uso; opte pela seguinte query:

UPDATE wp_users
SET user_login = 'login-novo'
WHERE user_login = 'login-antigo';

Ativar de Desativar Trackbacks e Pingbacks

Permita (ou não) o recebimento de notificações de outros posts e sites ao seu conteúdo.

UPDATE wp_posts SET ping_status = 'open'; // habilita
UPDATE wp_posts SET ping_status = 'closed'; // desabilita

Descobrir qual post recebe mais spam

De acordo com o tipo de conteúdo que seu projeto divulga, pode ocorrer de certos posts serem alvos de spammers. Talvez possa lhe ajudar a se proteger dessas tentativas de ataque, identificar quais conteúdos do site recebem mais spam.

SELECT 'comment_post_ID', COUNT(*) as amount
FROM 'wp_comments'
WHERE 'comment_approved' = 'spam'
GROUP BY 'comment_post_ID'
ORDER BY amount DESC
LIMIT 0, 20 

Desabilitar comentários em artigos antigos

Moderar comentários é um dos grandes trabalhos que o gestor de conteúdo terá diante de um site com tal recurso ativo. Em alguns casos, em razão da diminuição da relevância do assunto apresentado ou até mesmo pela dificuldade em realizar tal moderação, você pode optar por desabilitar os comentários de publicações antigas.

UPDATE wp_posts SET comment_status = 'closed' WHERE post_date < '2018-01-01' AND post_status = 'publish';

Exportar e-mail dos usuários (sem duplicidade)

Com o propósito de estreitar a relação e manter contato com os visitantes do site que deixaram comentários nas publicações; é possível recuperar todos os contatos, endereços de e-mail daqueles que deixaram sua contribuição no projeto.

SELECT DISTINCT( comment_author_email ) FROM wp_comments;
// o mesmo princípio se aplica para obter os e-mails dos usuários cadastrados
SELECT user_email FROM wp_users;
// não precisa do DISTINCT pois nesse caso o e-mail não se repete

Evidenciar visitantes com mais comentários

Ainda sobre os visitantes que deixaram sua contribuição, talvez seja interessante a você saber com clareza quais são os membros mais ativos no quesito comentários.

SELECT comment_author_email, COUNT( comment_ID ) AS comment_amount
FROM wp_comments
GROUP BY comment_author_email
ORDER BY comments DESC

Resetar permissões de um usuário para Assinante via SQL

Em projetos que empregam permissões personalizadas para seus utilizadores, possibilitar um downgrade de funções é um recurso muito explorado. Utilizando set_role você é capaz de alterar a permissão principal de cada indivíduo separadamente; no entanto é possível que alguma capacidade não seja devidamente removida. Rode a seguinte query SQL a fim de atribuir a capacidade padrão de assinante ao usuário cujo id será passado como parâmetro.

UPDATE wp_usermeta SET meta_value = 'a:1:{s:10:”subscriber”;b:1;}' where user_id=[ID] AND meta_key='wp_capabilities';

Outra situação que você pode precisar do comando acima ocorre mediante uso de plugins para controle customizado dos níveis de acesso. Eventualmente as capabilities dos usuários do WordPress podem conter valores sem uso ou mesmo definições redundantes; redefinir tais valores pode ser fundamental para manter o projeto e as restrições de acesso funcionando corretamente.

Desabilitar todos os plugins através do MySQL

Você talvez já tenha passado pela experiência de ativar um plugin e após isso não conseguir realizar mais nenhuma ação com seu site, sequer acessar o Dashboard. Nesse caso fica evidente o problema com o plugin, seja por erros em seu código-fonte ou problemas de compatibilidade com o Tema e/ou outros plugins. A solução imediata para resolver o problema é remover o plugin de seu servidor.

Porém o que fazer quando você faz ativação em lote ou mesmo quando o problema ocorre de modo inesperado e você não sabe diagnosticar sua origem? Para iniciar o trabalho de reparação do projeto, você pode optar por desativar todos os plugins.

UPDATE wp_options SET option_value = 'a:0:{}' WHERE option_name = 'active_plugins';

Como alterar o prefixo das tabelas do WordPress

Quando você instala o WordPress, uma prática muito recomendada é a troca do prefixo padrão das tabelas de wp_ para algum outro valor a fim de resguardar melhor suas informações. No entanto uma vez definido o prefixo, alterá-lo com o site em funcionamento pode ser a causa de alguns problemas, em especial de permissões de acesso.

Tabelas da instalação padrão do WordPress

Isso acontece porque ao definir o prefixo das tabelas de sua instalação WordPress, você também define algumas informações de controle dentro do WordPress. Por isso, caso você queira alterar os prefixos de suas tabelas, siga o passo-a-passo do exemplo abaixo; onde está sendo mudado o prefixo de wp_ para abc_.

. Defina o novo prefixo no arquivo de configurações wp-config.php

$table_prefix  = 'abc_';

. Altere os prefixos das tabelas no banco de dados, executar query dentro do MySQL

RENAME TABLE wp_links TO abc_links;
RENAME TABLE wp_options TO abc_options;
RENAME TABLE wp_postmeta TO abc_postmeta;
RENAME TABLE wp_posts TO abc_posts;
RENAME TABLE wp_termmeta TO abc_termmeta;
RENAME TABLE wp_terms TO abc_terms;
RENAME TABLE wp_term_relationships TO abc_term_relationships;
RENAME TABLE wp_term_taxonomy TO abc_term_taxonomy;
RENAME TABLE wp_usermeta TO abc_usermeta;
RENAME TABLE wp_users TO abc_users;

. Ainda no MySQL atualize, dentro da tabela de opções wp_options, o option_name da opção wp_user_roles para abc_user_roles

UPDATE abc_options SET option_name='abc_user_roles' WHERE option_name='wp_user_roles';

. Da mesma forma, entrar na tabela wp_usermeta e trocar os prefixos de wp_capabilities e wp_user_level também para o novo prefixo utilizado

UPDATE abc_usermeta SET meta_key='wp_capabilities' WHERE meta_key='abc_capabilities';
UPDATE abc_usermeta SET meta_key='wp_user_level' WHERE meta_key='wp_user_level';

Você ainda pode se resguardar de ter executado as alterações necessárias, usando o método replace para atualizar as tabelas:

UPDATE abc_usermeta SET meta_key=replace( meta_key, 'wp_', 'abc_' );

Comandos SQL úteis para migrar o servidor de sua instalação WordPress

O processo de migração de um site WordPress entre servidores é bem comum de ocorrer. Seja logo após concluir um projeto em localhost, quando é preciso enviar o projeto do ambiente de desenvolvimento para produção; seja para realizar mudanças de domínio (configuração de subdomínio, domínios diferentes, uso de CDN); ou mesmo para trocar o serviço de hospedagem.

Diante de situações como essa é possível que alguns problemas ocorram com seu projeto, principalmente cuja origem se dá através de dados não conformes existentes no banco de dados. Justamente para sanar os potenciais problemas que esse cenário possa gerar, você poderá fazer uso de algumas queries SQL que farão o projeto se manter em atividade como previsto.

Considerações iniciais para a migração

Para realizar qualquer tipo de modificação em sua base de dados, é sempre uma boa prática realizar um backup previamente. Desse modo você ficará seguro caso algo não funcione como esperado e você precise restaurar as informações antigas.

Quando for executar algum comando entre esses que estamos divulgando, verifique o prefixo de sua instalação do WordPress. Todos as instruções SQL a seguir, utilizaram o prefixo padrão do WordPress; caso você tenha alterado o prefixo durante sua instalação, lembre-se de alterá-lo também quando aplicar as instruções.

SELECT * FROM wp_users
// caso tenha alterado o prefixo wp_ para abc_, execute
SELECT * FROM abc_users

Alterar URL do site e da tela inicial

Se você transferiu sua instalação completa de WordPress em localhost para o seu servidor, incluindo a base de dados; é certo que ele não funcionou como previsto, sequer carregou. Esse problema ocorre devido em razão do caminho de URL absoluta ainda estar apontando para o servidor antigo (localhost). Ajuste os valores das opções siteurl e home para o endereço correto a fim de resolver essa situação.

UPDATE wp_options SET option_value = REPLACE(option_value, 'http://[endereço-antigo]', 'http://[endereço-novo]') WHERE option_name = 'home' OR option_name = 'siteurl';

Atualizar URL de conteúdos

Seguindo a migração, o conteúdo recém importado ainda estarão referenciando o endereço antigo. Para resolver o problema, aplique a mesma query de replace na tabela wp_posts, campos post_content e guid (este campo referencia o caminho absoluto de acesso ao post).

UPDATE wp_posts
SET guid = REPLACE( guid, 'http://[endereço-antigo]', 'http://[endereço-novo]' );

Caso queira aplicar a mesma técnica em wp_postmeta, no campo meta_value, tenha atenção com os campos serializadas; essa mudança pode acarretar na perda de alguns dados importantes para seu projeto.

Alterar apenas o caminho das imagens

Caso você esteja adotando uma nova estrutura de armazenamento para seus arquivos estáticos (como as imagens do seu projeto), e o fizer depois que o site já possuir conteúdo publicado com ligações a estrutura antiga; opte por alterar apenas tais endereços:

UPDATE wp_posts 
SET post_content = REPLACE( post_content, 'src="http://[endereço-antigo]', 'src="http://[endereço-novo]' );

Atualização de conteúdo

Como você pode verificar, o comando REPLACE possui várias aplicações úteis. Você também pode substituir qualquer outra informação do conteúdo dos posts em lote, como por exemplo um texto específico. Isso pode ser muito útil caso queira atualizar por exemplo alguma marca ou slogan presente nas publicações.

UPDATE wp_posts SET post_content = REPLACE( post_content, 'conteúdo para susbstituir', 'novo conteúdo' );

Alterar senha dos usuários

Pode ocorrer de você não ter acesso a antiga senha de administrador, como também existe a possibilidade do recurso de recuperar senha não estar funcionando em razão de algum problema com temas e plugins. Em situações como essas você pode atualizar a senha de um usuário sem grandes complicações atuando diretamente na tabela de usuários, no campo de senha.

UPDATE wp_users SET user_pass = MD5( 'senha' ) WHERE user_login = 'seu-login';

Limpe o banco de dados e melhore a performance do WordPress com algumas instruções SQL

Perceba que as instruções passadas são de atualização de informações (update, replace), justamente porque o trabalho proposto é unicamente de mudar o servidor ou o trabalho com domínios em seu projeto. Lembrando ainda o tópico referente a atualização de dados serializados, você encontrará informações do tipo principalmente nas tabelas meta (wp_postmeta, wp_commentmeta, wp_usermeta) e de opções (wp_options); para alterar também esses valores veja o curso WP-CLI, o WordPress em linha de comando. Você verá uma maneira rápida de atualizar todos esses valores com muita facilidade.

Outro ponto importante durante a manipulação da base de dados, ocasionalmente você se encontrará diante de algumas informações que pretende remover do seu projeto. Nesses casos você precisará de algumas queries SQL para limpar seu WordPress sem perder a integridade dos dados nele contidos.

As instruções SQL podem ser feitas via PHPMyAdmin, Terminal direto ou com os comandos do WP-CLI

Limpeza e integridade da base de dados

Um fator de grande impacto na performance de um site WordPress é o tempo de resposta das consultas feitas ao MySQL. Além de otimizar as consultas que são submetidas ao banco, muitas vezes é possível reduzir o tempo de processamento de requisições ao banco diminuindo também a quantidade de registros em desuso nele depositados.

Rastros de plugins, meta dados e opções antigas sem funcionalidade após a troca de temas, spams, vestígios de uma migração mal executada, existem diversas formas de se acumular informações sem propósito dentro da database. Tratar esses dados é sem dúvida um grande avanço com a otimização do seu projeto. Antes de seguir com qualquer alteração, vale lembrar a importância de possuir um backup caso algum imprevisto ocorra.

Tabelas personalizadas

Temas e plugins por vezes criam tabelas e registros próprios para gerenciar suas configurações e recursos. Eventualmente, por falha de programação da equipe desenvolvedora ou mesmo por ter sido removido indevidamente (excluindo os arquivos de modo direto) pelo administrador do site; tal como foi citado acima, alguns rastros podem permanecer no banco.

O primeiro passo é verificar a existência de tabelas personalizadas. Caso encontre uma tabela que não está sendo usada e tampouco será no futuro, trate de apagá-la.

Registros sem uso

Removidas as tabelas, o próximo passo é remover as informações que não serão utilizadas. As tabelas de meta dados e de opções são muito usadas tanto para temas como plugins, logo se existem registros conhecidos que devem ser removidos, execute:

DELETE FROM wp_postmeta WHERE meta_key = 'post-meta';
DELETE FROM wp_options WHERE option_name = 'nome-da-opcao';

Como boa prática de desenvolvimento e para efetuar registros duplicados, os desenvolvedores inserem prefixos aos dados por ele armazenados. Se esse for o caso, fica mais fácil fazer essa limpeza em lote.

DELETE FROM wp_postmeta WHERE meta_key LIKE 'prefixo_%';

Tags sem atribuição

Em projetos com grande volume de conteúdo publicado, que se utilizam das tags para organizar tal informação, por vezes nota-se uma série de tags sem nenhuma ou apenas uma atribuição a posts ou outros conteúdos. Caso queira você poderá apagar essas ocorrências com base na quantidade de atribuições das tags; no exemplo abaixo, nenhuma vez.

DELETE * FROM wp_terms wt
INNER JOIN wp_term_taxonomy wtt
ON wt.term_id=wtt.term_id
WHERE wtt.taxonomy='post_tag'
AND wtt.count=0;

Revisões de posts e vestígios

O recurso revisão de post é excelente para os gestores de conteúdo. No entanto com o tempo esse tipo de informação tende a crescer consideravelmente passando a interferir negativamente o carregamento das páginas. Uma alternativa para esse cenário visando a diminuição do seu banco de dados é remover as revisões que não serão mais utilizadas.

DELETE a,b,c FROM wp_posts a
LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id)
LEFT JOIN wp_postmeta c ON (a.ID = c.post_id)
WHERE a.post_type = 'revision'

Ao invés de apagar todas as revisões existentes, você pode optar por excluir apenas as mais antigas. Para isso inclua em sua condicional de consulta um valor limitante para o campo post_date.

... WHERE a.post_type = 'revision' AND DATE( a.post_date ) < '2018-01-01'

Excluir comentários marcados como spam

Se você tem milhares de comentários assinalados como spam e quer excluí-los todos de uma vez, ao invés de se frustrar em repetir a mesma ação pelo painel do WordPress, execute a seguinte query:

DELETE FROM wp_comments WHERE comment_approved = 'spam';

Remover pingback e trackback

Da mesma forma que foi possível realizar a rápida remoção dos spams, você também pode remover os linkbacks de seus comentários. A exclusão se dá com base no tipo de comentário.

DELETE FROM wp_comments WHERE comment_type = 'pingback' OR comment_type = 'trackback';

Mantendo sua base de dados limpa, sem armazenar dados irrelevantes e ocupando espaço desnecessário em seu banco, você agiliza o trabalho dos índices de consulta, libera espaço para inserir novos conteúdos e otimiza a performance de suas requisições ao MySQL.