Error wpdb::prepare llamado incorrectamente en WordPress
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.

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
)
);
