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