Error wpdb::prepare llamado incorrectamente en WordPress

16 jun 2014, 07:07:56
Vistas: 19.5K
Votos: 5

Tengo este código para eliminar posts huérfanos después de borrar un custom post type.

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á generando este error:

PHP Notice: wpdb::prepare fue llamado incorrectamente. El argumento query de wpdb::prepare() debe tener un placeholder.

Después de leer la explicación en make.wordpress.org por Andrew Nacin, entiendo (más o menos) que... bueno... me falta el segundo argumento.

Luego de leer este post de Stack, me pregunto si realmente necesito la función prepare(). ¿Hay alguna variable con valores desconocidos? No me queda claro esto.

...¿qué me estoy perdiendo?

ACTUALIZACIÓN: Este código también funciona, pero sin el prepare() 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 aconsejen.

0
Todas las respuestas a la pregunta 1
0
11

Siempre se recomienda usar $wpdb->prepare cuando se recibe entrada del usuario. Esto ayuda a proteger las consultas contra inyecciones SQL. Para más detalles, consulta el Codex

Cuando usas $wpdb->prepare, debes pasar las variables a la consulta. En tu caso, puedes omitir el uso de $wpdb->prepare ya que estás usando un valor fijo. Pero si tienes el mismo valor en forma de variable, necesitas 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
     )
);
16 jun 2014 09:59:59