Pergunta

Eu tenho esse código para remover postagens órfãs após excluir o tipo de postagem personalizado.

Funciona, mas esse código...

global $wpdb;
$wpdb->query( 
    $wpdb->prepare( 
    "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='attorneys'"
  )
);

... está gerando este erro:

Aviso PHP:wpdb::prepare foi chamado incorretamente.O argumento de consulta de wpdb::prepare() deve ter um espaço reservado.

Então, depois de ler a explicação em make.wordpress.org por Andrew Nacin, eu (mais ou menos) entendo que ... bem ..Estou sentindo falta do segundo argumento.

Então depois de ler esta postagem da pilha, estou me perguntando se preciso mesmo do prepare() função. Existem alguma variável contendo valores desconhecidos?Não estou claro sobre isso.

...o que estou perdendo?

ATUALIZAR:Este código também funciona, mas sem prepare() eu me pergunto se é seguro.

global $wpdb;
$wpdb->query( 
  "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='attorneys'"
);

Por favor, avise.

Foi útil?

Solução

É sempre aconselhável usar $wpdb->prepare quando você está recebendo informações do usuário.Isso ajudará a proteger consultas contra SQL Injection.Para mais detalhes, verifique o Códice

Quando você usa $wpdb->prepare, você deve passar as variáveis ​​para a consulta.No seu caso, você pode pular usando $wpdb->prepare como você está usando um valor codificado.Mas se você tiver o mesmo valor em termos de uma variável, será necessário modificá-lo conforme abaixo

$post_type = 'attorneys';

$wpdb->query( 
     $wpdb->prepare(
          "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=%s",
          $post_type
     )
);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a wordpress.stackexchange
scroll top