¿Cómo eliminar manualmente una entrada de la base de datos sin causar conflictos?

6 abr 2012, 19:58:52
Vistas: 30.6K
Votos: 3

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;
0
Todas las respuestas a la pregunta 5
6

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

23 ago 2012 21:29:03
Comentarios

¡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 AlxVallejo
23 ago 2012 21:34:48

@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.

Brian Fegter Brian Fegter
23 ago 2012 21:37:48

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 AlxVallejo
23 ago 2012 21:43:33

@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.)

Brian Fegter Brian Fegter
23 ago 2012 21:47:29

@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).

Damien Damien
24 ago 2012 19:34:10

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

Eli Jayson Eli Jayson
23 jun 2020 21:13:46
Mostrar los 1 comentarios restantes
0

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.

23 ago 2012 21:41:21
0

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;
}
31 jul 2019 22:01:29
8

¿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.

23 ago 2012 19:30:34
Comentarios

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?

AlxVallejo AlxVallejo
23 ago 2012 19:48:57

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

Tribalpixel Tribalpixel
23 ago 2012 20:30:57

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

AlxVallejo AlxVallejo
23 ago 2012 20:47:54

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

Tribalpixel Tribalpixel
23 ago 2012 20:52:05

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.

AlxVallejo AlxVallejo
23 ago 2012 20:55:08

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

Tribalpixel Tribalpixel
23 ago 2012 21:00:58

@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.

Brian Fegter Brian Fegter
23 ago 2012 21:31:54

Brian, ¡todo este sitio se trata de buena voluntad!

AlxVallejo AlxVallejo
23 ago 2012 21:36:02
Mostrar los 3 comentarios restantes
7
-2

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*/
6 abr 2012 20:07:36
Comentarios

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.

AlxVallejo AlxVallejo
6 abr 2012 20:40:47

sí, object_id es post_id

Eugene Manuilov Eugene Manuilov
6 abr 2012 22:28:48

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 AlxVallejo
16 jul 2012 21:05:26

@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.

Brian Fegter Brian Fegter
23 ago 2012 20:47:57

@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 AlxVallejo
23 ago 2012 20:57:34

@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.

Brian Fegter Brian Fegter
23 ago 2012 21:01:23

@BrianFegter No estoy de acuerdo. Eliminar manualmente una publicación, en el contexto que expliqué, es una llamada de ayuda y espero haber proporcionado suficiente investigación por mi cuenta para ayudar a resolver el problema.

AlxVallejo AlxVallejo
23 ago 2012 21:02:38
Mostrar los 2 comentarios restantes