Pregunta

Tengo este código para eliminar publicaciones huérfanas después de eliminar el tipo de publicación personalizada.

Funciona, pero este 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á arrojando este error:

Aviso de PHP:wpdb::prepare fue llamado incorrectamente.El argumento de consulta de wpdb::prepare() debe tener un marcador de posición.

Entonces, después de leer la explicación En make.wordpress.org de Andrew Nacin, deduzco (más o menos) que... bueno...Me falta el segundo argumento.

Luego después de leer esta publicación de pila, Me pregunto si siquiera necesito el prepare() función. Hay ¿Alguna variable que tenga valores desconocidos?No lo tengo claro.

...¿Qué me estoy perdiendo?

ACTUALIZAR:Este código también funciona, pero sin preparar() Me pregunto si es 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.

¿Fue útil?

Solución

Siempre se recomienda utilizar $wpdb->prepare cuando recibe información del usuario.Esto ayudará a proteger las consultas contra la inyección SQL.Para más detalles, consulte el Códice

cuando usas $wpdb->prepare, debes pasar las variables a la consulta.En su caso, puede omitir el uso $wpdb->prepare ya que está utilizando un valor codificado.Pero si tiene el mismo valor en términos de una variable, debe modificarlo como se muestra a continuación

$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 bajo: CC-BY-SA con atribución
scroll top