Come eliminare manualmente un post dal database senza causare conflitti?
Per qualche motivo, ho un post e una pagina con lo stesso nome slug e questo causa il blocco del database. Non posso modificare lo slug su nessuno dei due, quindi devo eliminare manualmente i post dal database e ricominciare da capo.
Sono disposto ad estrarre l'ID del post da wp_posts e wp_postmeta ed eliminare manualmente ogni voce. Questo creerà problemi ad altri elementi nel database, assumendo che non ci siano commenti né sul post né sulla pagina?
MODIFICA
Ho trovato questo script e penso sia corretto, ma non sono sicuro se questo gestisce le revisioni o qualsiasi altra cosa che potrei lasciare indietro eliminando manualmente il post
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;

Aggiungi questo codice in un file nella directory del tuo plugin e sarai in grado di eliminare un post specifico dalla tua installazione WordPress utilizzando una query string.
/*
Plugin Name: Elimina Post Specifico
Description: Rimuovi definitivamente il post!
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 forza l'eliminazione definitiva del post senza inviarlo al Cestino
if($delete)
echo "Post $id eliminato con successo!";
else
echo "Il post $id non è stato eliminato.";
exit;
}
}
Tutto ciò che devi fare è assicurarti di essere loggato come amministratore, quindi visitare: http://tuodominio.com/wp-admin/?delete_post=POSTID

Ottimo! Questa è un'alternativa con cui posso lavorare. Mi è stato detto però che avere troppi plugin rallenta il sito... Sono ancora orientato verso la query SQL.

@AlxVallejo WordPress è fondamentalmente una raccolta di plugin che si agganciano ad altre funzionalità e forniscono ulteriori agganci. Detto questo, avere script di terze parti nella cartella dei plugin non rallenterà il tuo sito - è un mito completo. L'unico caso in cui un plugin può rallentare il sistema è quando è attivo. Attivalo quando ti serve, disattivalo quando non ti serve più.

Ti darò credito, ma credo ancora che eliminare manualmente i post su un database WP sia un'abilità essenziale che dovrebbe essere pubblicizzata nel caso in cui un post causi problemi. Non capisco perché tutti siano contrari a scrivere SQL - l'atto di attivare un plugin solo per rimuovere un post dal DB mi sembra, imho, sciocco. Grazie per la guida, potrei effettivamente usare questo formato per altre funzioni che penso di utilizzare con il parametro query_var.

@AlxVallejo Non sono contrario all'uso di MYSQL per questo. http://3-3.me/6DUn L'ho usato in passato, ma per me accedere a mysql (tramite client o riga di comando ed eseguire questa query è tanto lavoro quanto attivare un plugin nella mia directory e digitare una stringa di query.)

@AlxVallejo qualcun altro oggi ha commentato una mia risposta riguardo al perché usare un plugin quando puoi farlo con una riga di codice o SQL. Il mio punto è che MOLTE persone vogliono un'opzione senza problemi, proprio come dire "non sai che esiste un plugin (app) per quello" e sono queste stesse persone che amano usare WordPress (rispetto a Drupal o molti altri CMS)

Vedi sotto https://wordpress.stackexchange.com/a/344090/99080 per un plugin con una pagina admin per eliminare più post contemporaneamente

Recentemente ho avuto questo problema con un post-type che volevo eliminare completamente, con relazioni ovunque e nessun vincolo di chiave esterna con cascade a livello di database.
/* ELIMINA LE REVISIONI */
DELETE posts
FROM
`prefix_posts` AS posts
INNER JOIN `prefix_posts` AS parents ON posts.post_parent = parents.ID
WHERE
parents.post_type = "myposttype"; /*SOSTITUISCI CON parents.ID = "yourID"*/
/* ELIMINA I POST */
DELETE
FROM
`prefix_posts`
WHERE
post_type = "myposttype"; /*SOSTITUISCI CON ID = "yourID"*/
/* ELIMINA I METADATI ORFANI */
DELETE
FROM
`prefix_postmeta`
WHERE
`prefix_postmeta`.`post_id` NOT IN(
SELECT
`prefix_posts`.`ID`
FROM
`prefix_posts`
);
Stai utilizzando plugin che creano tabelle personalizzate? (come post-2-post)
/* RELAZIONI POST2POST ORFANE */
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`
);
Probabilmente è più semplice usare le funzioni integrate di WordPress... ma se hai bisogno di chiamate SQL per questo, guarda sopra.

Ampliando la risposta di @Brian Fegter sopra potresti utilizzare il seguente plugin per rimuovere articoli in blocco. Crea una pagina di amministrazione WP con un'area di testo per gli ID delle pagine/articoli da eliminare.
<?php
/*
Plugin Name: Delete Posts By ID
Description: Elimina articoli e pagine tramite ID
Version: 0.1
Author: WPSE
License: GPL2
*/
add_action( 'admin_menu', 'deletePostsMenu' );
function deletePostsMenu() {
add_menu_page(
'Elimina Articoli',
'Elimina Articoli',
'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>Elimina Articoli per ID</h2>
<p>Inserisci gli ID di articoli/pagine separati da un'interruzione di riga</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;
/* // Rimuovi spazi bianchi
$stripped = str_replace(' ', '', $submittedIDs);*/
// Converti in array
$idsArray = explode("\r\n",$submittedIDs);
echo '<ol>';
// Elimina articoli per ID
foreach ($idsArray as $id){
$delete = wp_delete_post($id, false); //True forza l'eliminazione definitiva senza inviare nel Cestino
if($delete)
echo "<li>Articolo $id eliminato con successo!</li>";
else
echo "<li>Articolo $id non è stato eliminato.</li>";
}
echo '</ol>';
exit;
}

perché non usare semplicemente wp_delete_post()?
Quando il post o la pagina vengono eliminati, tutto ciò che è collegato ad essi viene eliminato automaticamente. Questo include commenti, campi meta del post e relazioni tra il post e i termini di tassonomia.

Ciò richiederebbe essenzialmente che io crei un menu personalizzato e abbia qualche tipo di campo per inserire l'ID del post. Andare direttamente su phpmyadmin sembra più veloce fintanto che colpisco le aree giuste. A meno che tu non abbia un posto migliore per quella funzione?

hai solo bisogno di una lista (array) di post_id da eliminare. come costruisci questa lista (query, manualmente,...) dipende da te... e fai un foreach per eliminare i post

Beh, ti serve anche un template di pagina per eseguire la funzione... in che altro modo esegui una funzione?

ci sono molti modi per attivare la tua funzione in WordPress... ma questo non è specifico per la tua domanda
come ha detto Brian Fegter: WPSE è per domande non per far fare il lavoro agli altri. Se hai bisogno di uno sviluppatore, probabilmente dovresti assumere qualcuno

Ok ma questo non risponde alla mia domanda. Usare wp_delete_post è incompleto perché non spieghi come usarlo e perché sarebbe meglio che andare direttamente a SQL. Puoi eseguire il comando SQL nella finestra SQL di phpmyadmin; Con wp_delete_post, puoi ... In altre parole, la tua risposta manca di contesto.

Quando il post e la pagina vengono eliminati, tutto ciò che è collegato ad essi viene eliminato. Questo include commenti, campi meta del post e relazioni tra il post e i termini di tassonomia. Non è sufficiente per farti pensare che sia meglio usare la funzione di WordPress? Se no, non posso fare altro per te mi dispiace... fai un sacco di query mysql e fai errori per imparare :)

@AlxVallejo Come gesto di buona volontà, ho creato un plugin che non necessita di un pannello di amministrazione e ti permette di eliminare un post specifico tramite una stringa di query. Vedi la mia risposta a questa domanda.

Ok, se vuoi eliminarlo completamente, devi rimuovere il post/pagina dalla tabella wp_term_relationships
. Ma se il problema riguarda solo lo slug, puoi aggiornare il record corrispondente nel database e i tuoi slug verranno corretti. Per aggiornare lo slug devi eseguire questa query:
UPDATE wp_posts SET post_name = 'my-new-slug' WHERE ID = /*inserisci qui l'ID del tuo post*/

wp_term_relationships ha object_id. Questo è post_id? Pensavo che i post fossero separati dalle relazioni con i termini della tassonomia.

Due domande: Puoi aiutarmi a scrivere uno script per eliminare manualmente un post che includa post_meta e (wp_term_relationships) per un dato ID post? E secondo, l'ottimizzazione del database pulisce i metadati orfani dei post eliminati?

@AlxVallejo Un gentile promemoria: WPSE è per domande, non per far fare il lavoro ad altri. Se hai bisogno di uno sviluppatore, probabilmente dovresti assumere qualcuno.

@BrianFegter Le persone consigliano script SQL continuamente qui e su SE, non vedo il male nel chiedere... La risposta sopra non risponde neanche alla domanda, a meno che non avessi chiesto come cambiare il nome dello slug.

@AlxVallejo Chiedere suggerimenti o consigli è una cosa. Chiedere esplicitamente a qualcuno di fare il lavoro al posto tuo, ad esempio "Puoi aiutarmi a scrivere uno script per eliminare manualmente un post?", non è lo scopo di questo forum.
