¿Cómo eliminar manualmente una entrada de la base de datos sin causar conflictos?
Por alguna razón, tengo una entrada y una página con el mismo nombre de slug y esto hace que la base de datos se bloquee. No puedo modificar el slug en ninguno de los dos, así que necesito eliminar manualmente las entradas de la base de datos y empezar de nuevo.
Estoy dispuesto a obtener el ID de la entrada desde wp_posts y wp_postmeta y eliminar manualmente cada registro. ¿Esto causará algún problema en la base de datos asumiendo que no tengo comentarios en ninguna de las entradas o páginas?
EDICIÓN
Encontré este script y creo que está bien, pero no estoy seguro si esto se encarga de las revisiones o cualquier otra cosa que podría quedar al eliminar manualmente la entrada
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.ID = xxx;

Coloca esto en un archivo dentro del directorio de tu plugin y podrás hacer esto desde tu instalación de WP usando una cadena de consulta.
/*
Plugin Name: Eliminar Post Específico
Description: ¡Deshazte del post para siempre!
Version: 0.1
Author: WPSE
License: GPL2
*/
add_filter('query_vars', 'delete_post_query_var');
function delete_post_query_var($vars){
$vars[] = 'delete_post';
return $vars;
}
add_action('admin_init', 'manually_delete_post', 0);
function manually_delete_post(){
if(!is_user_logged_in())
return;
if(!current_user_can('manage_options'))
return;
if(get_query_var('delete_post')){
$id = esc_attr(get_query_var('delete_post'));
$delete = wp_delete_post($id, true); //True elimina el post permanentemente sin enviarlo a la Papelera
if($delete)
echo "¡Post $id eliminado con éxito!";
else
echo "El post $id no fue eliminado.";
exit;
}
}
Todo lo que necesitas hacer es asegurarte de que estás conectado como administrador, luego visita: http://yourdomain.com/wp-admin/?delete_post=POSTID

¡Genial! Esta es una alternativa con la que puedo trabajar. Me han dicho que tener demasiados plugins ralentiza el sitio... Aún así, me inclino por la consulta SQL.

@AlxVallejo WordPress básicamente es una colección de plugins que se conectan con otra funcionalidad y proporcionan más enlaces. Dicho esto, no ralentizará tu sitio tener scripts de terceros en tu carpeta de plugins -- eso es un completo mito. El único momento en que un plugin puede ralentizar tu sistema es si está activo. Actívalo cuando lo necesites, desactívalo cuando no lo necesites.

Te daré crédito pero sigo creyendo que eliminar manualmente publicaciones en una base de datos de WP es una habilidad esencial que debería difundirse en caso de que una publicación cause problemas. No sé por qué todos están en contra de escribir SQL - el acto de activar un plugin solo para eliminar una publicación de la base de datos me parece, en mi opinión, una tontería. Gracias por el artículo, en realidad podría usar este formato para otras funciones que pienso usar con el parámetro query_var.

@AlxVallejo No estoy en contra de usar MYSQL para esto. http://3-3.me/6DUn Lo he usado en el pasado, pero para mí iniciar sesión en mysql (a través del cliente o la línea de comandos y ejecutar esta consulta es tanto trabajo como activar un plugin en mi directorio y escribir una cadena de consulta.)

@AlxVallejo alguien más hizo un comentario hoy en una de mis respuestas sobre: ¿por qué usarías un plugin cuando puedes hacerlo con una línea de código o SQL? Mi punto es que MUCHAS personas quieren una opción sin complicaciones, como decir "¿no sabes que hay un plugin (aplicación) para eso?" y son estas mismas personas a las que les encanta usar WordPress (en comparación con Drupal o muchos otros CMS).

Mira abajo https://wordpress.stackexchange.com/a/344090/99080 para ver un plugin con una página de administración para eliminar múltiples publicaciones a la vez

Recientemente tuve este problema con un tipo de entrada que quería eliminar por completo, con relaciones por todas partes y sin restricciones de clave foránea en cascada en la base de datos.
/* ELIMINAR REVISIONES */
DELETE posts
FROM
`prefix_posts` AS posts
INNER JOIN `prefix_posts` AS parents ON posts.post_parent = parents.ID
WHERE
parents.post_type = "miposttype"; /*REEMPLAZAR CON parents.ID = "tuID"*/
/* ELIMINAR ENTRADAS */
DELETE
FROM
`prefix_posts`
WHERE
post_type = "miposttype"; /*REEMPLAZAR CON ID = "tuID"*/
/* ELIMINAR METADATOS HUÉRFANOS */
DELETE
FROM
`prefix_postmeta`
WHERE
`prefix_postmeta`.`post_id` NOT IN(
SELECT
`prefix_posts`.`ID`
FROM
`prefix_posts`
);
¿Estás usando algún plugin que cree tablas? (como post-2-post)
/* RELACIONES POST2POST HUÉRFANAS */
DELETE
FROM
`prefix_p2p`
WHERE
`prefix_p2p`.`p2p_from` NOT IN(
SELECT
`prefix_posts`.`ID`
FROM
`prefix_posts`
);
DELETE
FROM
`prefix_p2p`
WHERE
`prefix_p2p`.`p2p_to` NOT IN(
SELECT
`prefix_posts`.`ID`
FROM
`prefix_posts`
);
Probablemente sea más fácil usar las funciones integradas de WP... pero si necesitas llamadas SQL para esto, mira arriba.

Ampliando la respuesta de @Brian Fegter anterior, podrías usar el siguiente plugin para eliminar publicaciones en masa. Crea una página en el administrador de WP con un área de texto para ingresar los IDs de páginas/publicaciones a eliminar.
<?php
/*
Plugin Name: Eliminar Publicaciones por ID
Description: Elimina publicaciones y páginas por ID
Version: 0.1
Author: WPSE
License: GPL2
*/
add_action( 'admin_menu', 'deletePostsMenu' );
function deletePostsMenu() {
add_menu_page(
'Eliminar Publicaciones',
'Eliminar Publicaciones',
'manage_options',
'delete-posts/delete-posts-admin-page.php',
'delete_posts_admin_page',
'dashicons-trash',
6
);
}
function delete_posts_admin_page() {
?>
<div class="wrap">
<h2>Eliminar Publicaciones por ID</h2>
<p>Añade IDs de publicaciones/páginas separados por un salto de línea</p>
<form action="" method="post">
<label for="deletePostsByID"></label>
<textarea name="deletePostsByID" id="ids" cols="30" rows="10"></textarea>
<input type="submit">
</form>
</div>
<?php
if (isset($_POST['deletePostsByID'])) {
delete_posts($_POST['deletePostsByID']);
return;
}
}
//add_action('admin_init', 'manually_delete_post', 0);
function delete_posts($submittedIDs){
if(!is_user_logged_in())
return;
if(!current_user_can('manage_options'))
return;
/* // Eliminar espacios en blanco
$stripped = str_replace(' ', '', $submittedIDs);*/
// Convertir a array
$idsArray = explode("\r\n",$submittedIDs);
echo '<ol>';
// Eliminar publicaciones por ID
foreach ($idsArray as $id){
$delete = wp_delete_post($id, false); //True elimina permanentemente la publicación sin enviarla a la Papelera
if($delete)
echo "<li>Publicación $id eliminada correctamente!</li>";
else
echo "<li>La publicación $id no fue eliminada.</li>";
}
echo '</ol>';
exit;
}

¿Por qué no simplemente usar wp_delete_post()?
Cuando el post o página se elimina, todo lo que está vinculado a él también se borra. Esto incluye comentarios, campos de metadatos del post y las relaciones entre el post y los términos de taxonomía.

Eso esencialmente requeriría que construya un menú personalizado y tenga algún tipo de campo para ingresar el ID de la publicación. Ir directamente a phpmyadmin parece más rápido siempre y cuando toque las áreas correctas. A menos que tengas un mejor lugar para esa función?

solo necesitas una lista(array) de post_id para eliminar. cómo construyes esta lista (consulta, manualmente,...) es tu decisión... y hacer un foreach para eliminar las publicaciones

Bueno, también necesitas una plantilla de página para ejecutar la función... ¿de qué otra manera ejecutas una función?

hay muchas formas de activar tu función en WordPress... pero esto no es específico para tu pregunta
como Brian Fegter dijo: WPSE es para preguntas no para que otros hagan el trabajo por ti. Si necesitas un desarrollador, probablemente deberías buscar contratar a alguien

Ok pero esto no responde mi pregunta. Usar wp_delete_post es incompleto porque no explicas cómo usarlo y por qué sería mejor que ir directamente a SQL. Puedes ejecutar el comando SQL en la ventana SQL de phpmyadmin; Con wp_delete_post, puedes... En otras palabras, a tu respuesta le falta contexto.

Cuando el post y la página desaparecen, todo lo que está vinculado a ellos también se elimina. Esto incluye comentarios, campos de metadatos y relaciones entre el post y los términos de taxonomía. ¿No es eso suficiente para que pienses que es mejor usar la función de WordPress? Si no, no puedo hacer nada más por ti lo siento... ve y haz muchas consultas mysql y comete errores para aprender :)

@AlxVallejo Como muestra de buena voluntad, creé un plugin que no necesita un panel de administración y te permite eliminar una publicación específica mediante una cadena de consulta. Mira mi respuesta en esta pregunta.

Ok, si deseas eliminarlo completamente, debes eliminar la publicación/página de la tabla wp_term_relationships
. Pero si el problema es solo en el slug, puedes actualizar el registro correspondiente en la base de datos y tus slugs se corregirán. Para actualizar el slug necesitas ejecutar la siguiente consulta:
UPDATE wp_posts SET post_name = 'my-new-slug' WHERE ID = /*your post ID here*/

wp_term_relationships tiene object_id. ¿Ese es el post_id? Pensé que los posts estarían separados de las relaciones de taxonomía-término.

Dos preguntas: ¿Puedes ayudarme a escribir un script para eliminar manualmente un post que incluya post_meta y (wp_term_relationships) para un ID de post dado? Y segundo, ¿optimizar la base de datos limpia los metadatos perdidos de posts eliminados?

@AlxVallejo Una nota amistosa: WPSE es para preguntas, no para que otros hagan el trabajo por ti. Si necesitas un desarrollador, probablemente deberías considerar contratar a alguien.

@BrianFegter La gente recomienda scripts SQL todo el tiempo aquí y en SE, no veo el daño en preguntar... La respuesta de arriba tampoco responde a la pregunta, a menos que hubiera preguntado cómo cambiar el slug.

@AlxVallejo Pedir sugerencias o consejos es una cosa. Pedir explícitamente que alguien haga el trabajo por ti, es decir, '¿Puedes ayudarme a escribir un script para eliminar un post manualmente?' no es para lo que está este foro.
