Cum să ștergi manual o postare din baza de date fără a cauza conflicte?
Din diverse motive, am o postare și o pagină cu același slug și acest lucru face ca baza de date să se blocheze. Nu pot modifica slug-ul pentru niciuna dintre ele, așa că trebuie să șterg manual postările din baza de date și să o iau de la capăt.
Sunt dispus să extrag ID-ul postării din wp_posts și wp_postmeta și să șterg manual fiecare intrare. Acest lucru va strica altceva în baza de date presupunând că nu am comentarii pe niciuna dintre postări sau pagini?
EDITARE
Am găsit acest script și cred că e în regulă, dar nu sunt sigur dacă acesta se ocupă de revizii sau orice altceva ce aș lăsa în urmă după ștergerea manuală a postării
DELETE a,b,c
FROM wp_posts a
LEFT JOIN wp_term_relationships b ON ( a.ID = b.object_id )
LEFT JOIN wp_term_relationships c ON ( a.ID = c.post_id )
WHERE a.ID = xxx;

Adaugă acest cod într-un fișier în directorul plugin-ului tău și vei putea șterge postări din instalarea ta WordPress folosind un parametru în URL.
/*
Plugin Name: Șterge Postare Specifică
Description: Elimină definitiv postarea!
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 forțează ștergerea permanentă, fără a trimite postarea la Gunoi
if($delete)
echo "Postarea $id a fost ștearsă cu succes!";
else
echo "Postarea $id nu a putut fi ștearsă.";
exit;
}
}
Tot ce trebuie să faci este să te asiguri că ești autentificat cu un cont de administrator, apoi să vizitezi: http://yourdomain.com/wp-admin/?delete_post=POSTID

Super! Aceasta este o alternativă cu care pot lucra. Mi s-a spus că prea multe pluginuri încetinesc site-ul... Încă mă gândesc la interogarea SQL.

@AlxVallejo WordPress este practic o colecție de pluginuri care se conectează la alte funcționalități și oferă mai multe cârlige. Cu toate acestea, nu va încetini site-ul să ai scripturi terțe în folderul de pluginuri - acesta este un mit complet. Singura dată când un plugin poate încetini sistemul este dacă este activ. Activează-l când ai nevoie, dezactivează-l când nu mai ai nevoie.

Îți voi da credit, dar încă cred că ștergerea manuală a postărilor într-o bază de date WP este o abilitate esențială care ar trebui făcută publică în cazul în care o postare cauzează probleme. Nu înțeleg de ce toată lumea este împotriva scrierii de SQL - acțiunea de a activa un plugin doar pentru a șterge o postare din baza de date mi se pare, sincer, ridicolă. Mulțumesc pentru explicație, cred că aș putea folosi acest format și pentru alte funcții folosind parametrul query_var.

@AlxVallejo Nu sunt împotriva utilizării MYSQL pentru asta. http://3-3.me/6DUn Am folosit asta în trecut, dar pentru mine logarea în mysql (prin client sau linie de comandă și rularea acestei interogări este la fel de multă muncă ca și activarea unui plugin în directorul meu și tastarea unui șir de interogare.)

@AlxVallejo altcineva a făcut un comentariu astăzi la un răspuns al meu legat de: de ce ai folosi un plugin când poți face asta cu o linie de cod sau SQL. Ideea mea este că MULȚI oameni doresc o opțiune fără probleme la fel cum ar fi să spui "nu știi că există un plugin (aplicație) pentru asta" și aceiași oameni adoră să folosească WordPress (față de Drupal sau multe alte CMS-uri)

Vezi mai jos https://wordpress.stackexchange.com/a/344090/99080 pentru un plugin cu o pagină de administrare pentru ștergerea mai multor articole simultan

Am avut recent această problemă cu un tip de postare pe care voiam să-l elimin definitiv, cu relații peste tot și fără constrângeri de cheie străină (FK) cu cascadare în baza de date.
/* ȘTERGERE REVIZII */
DELETE posts
FROM
`prefix_posts` AS posts
INNER JOIN `prefix_posts` AS parents ON posts.post_parent = parents.ID
WHERE
parents.post_type = "myposttype"; /*ÎNLOCUIȚI CU parents.ID = "yourID"*/
/* ȘTERGERE POSTĂRI */
DELETE
FROM
`prefix_posts`
WHERE
post_type = "myposttype"; /*ÎNLOCUIȚI CU ID = "yourID"*/
/* ȘTERGERE METADATE ORFANE */
DELETE
FROM
`prefix_postmeta`
WHERE
`prefix_postmeta`.`post_id` NOT IN(
SELECT
`prefix_posts`.`ID`
FROM
`prefix_posts`
);
Folosești vreun plugin care creează tabele? (cum ar fi post-2-post)
/* RELAȚII POST-TO-POST 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`
);
Probabil e mai ușor să folosești funcțiile încorporate în WP... dar dacă ai nevoie de interogări SQL pentru asta, vezi mai sus.

Extinzând răspunsul lui @Brian Fegter Mai sus, puteți utiliza următorul plugin pentru a șterge articole în masă. Acesta creează o pagină în administrarea WordPress cu un câmp text pentru ID-urile paginilor/articolelor de șters.
<?php
/*
Plugin Name: Șterge Articole după ID
Description: Șterge articole și pagini după ID
Version: 0.1
Author: WPSE
License: GPL2
*/
add_action( 'admin_menu', 'deletePostsMenu' );
function deletePostsMenu() {
add_menu_page(
'Șterge Articole',
'Șterge Articole',
'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>Șterge Articole după ID</h2>
<p>Adaugă ID-uri de articole/pagini separate prin linie nouă</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;
/* // Elimină spațiile albe
$stripped = str_replace(' ', '', $submittedIDs);*/
// Transformă în array
$idsArray = explode("\r\n",$submittedIDs);
echo '<ol>';
// Șterge articolele după ID
foreach ($idsArray as $id){
$delete = wp_delete_post($id, false); //True șterge definitiv articolul și nu îl trimite la Coșul de gunoi
if($delete)
echo "<li>Articolul $id a fost șters cu succes!</li>";
else
echo "<li>Articolul $id nu a fost șters.</li>";
}
echo '</ol>';
exit;
}

de ce să nu folosești pur și simplu wp_delete_post() ?
Când articolul sau pagina este ștearsă, tot ce este legat de ele va fi șters de asemenea. Aceasta include comentarii, câmpuri meta pentru articole și relațiile dintre articol și termenii de taxonomie.

Asta ar însemna practic să construiesc un meniu personalizat și să am un câmp pentru a introduce ID-ul postării. Mergând direct în phpmyadmin pare mai rapid, atâta timp cât accesez zonele corecte. Doar dacă ai o locație mai bună pentru acea funcție?

ai nevoie doar de o listă (array) cu post_id pentru ștergere. modul în care construiești această listă (interogare, manual,...) depinde de tine... și apoi folosești un foreach pentru a șterge postările

Ei bine, ai nevoie și de un șablon de pagină pentru a executa funcția... altfel cum ai executa o funcție?

există multe modalități de a declanșa funcția ta în WordPress... dar asta nu este specific întrebării tale
cum a spus Brian Fegter: WPSE este pentru întrebări, nu pentru ca alții să facă munca în locul tău. Dacă ai nevoie de un dezvoltator, probabil ar trebui să cauți pe cineva angajat

Ok, dar asta nu răspunde la întrebarea mea. Folosirea wp_delete_post este incompletă pentru că nu explici cum să o folosești și de ce ar fi mai bună decât să mergi direct la SQL. Poți executa comanda SQL în fereastra SQL din phpmyadmin; Cu wp_delete_post, poți... Cu alte cuvinte, răspunsului tău îi lipsește contextul.

Când articolul sau pagina sunt șterse, tot ce este legat de ele este de asemenea eliminat. Aceasta include comentarii, câmpuri meta ale articolului și relațiile dintre articol și termenii taxonomiei. Nu este suficient pentru tine să consideri că e mai bine să folosești funcția WordPress? Dacă nu, nu pot face nimic mai mult pentru tine, îmi pare rău... mergi și fă o mulțime de interogări mysql și fă greșeli ca să înveți :)

@AlxVallejo Ca un gest de bunăvoință, am creat un plugin care nu necesită un panou de administrare și îți permite să ștergi un anumit post prin intermediul unui șir de interogare. Vezi răspunsul meu la această întrebare.

Bine, dacă doriți să ștergeți complet, trebuie să ștergeți postul/pagina din tabelul wp_term_relationships
. Dar dacă problema este doar în slug, puteți actualiza înregistrarea corespunzătoare în baza de date și slug-urile vor fi corectate. Pentru a actualiza slug-ul, trebuie să rulați următoarea interogare:
UPDATE wp_posts SET post_name = 'my-new-slug' WHERE ID = /*ID-ul postului dvs. aici*/

Tabelul wp_term_relationships are coloana object_id. Este acela post_id? Am crezut că postările ar fi separate de relațiile taxonomy-term.

Două întrebări: Poți să mă ajuți să scriu un script pentru a șterge manual o postare care include post_meta și (wp_term_relationships) pentru un anumit ID de postare? Și a doua, Optimizarea bazei de date curăță metadatele pierdute pentru postările șterse?

@AlxVallejo O notă prietenoasă: WPSE este pentru întrebări, nu pentru ca alții să facă munca în locul tău. Dacă ai nevoie de un dezvoltator, probabil ar trebui să cauți pe cineva să angajezi.

@BrianFegter Oamenii recomandă scripturi SQL tot timpul aici și pe SE, nu văd rău în a întreba... Răspunsul de mai sus nu răspunde nici la întrebare, decât dacă aș fi întrebat cum să schimb numele slug-ului.

@AlxVallejo A cere sugestii sau sfaturi este una. A cere explicit ca cineva să facă munca pentru tine, adică "Poți să mă ajuți să scriu un script pentru a șterge manual un post?", nu este scopul acestui forum.
