web-dev-qa-db-fra.com

Suppression de messages personnalisés et de métadonnées lors de la désinstallation

Mon fichier uninstall.php ne supprimera pas mes publications personnalisées et les métadonnées qui leur sont associées lors de la désinstallation. Les fichiers du plugin sont supprimés, mais rien de la base de données.

Si quelqu'un est capable de regarder cela et de voir si j'ai quelque chose de mal ou s'il me manque quelque chose, je l'apprécierais grandement.

Merci!

// If uninstall is not called from WordPress, or the current user doesn't have the capability to delete plugins
if ( !defined( 'WP_UNINSTALL_PLUGIN' ) || !current_user_can_for_blog( $GLOBALS['blog_id'], 'delete_plugins' ) ) {
    exit();
}

// Remove posts of the 'mrlpt_client' type from DB and the post meta

function mrlpt_delete_plugin() {

    $mrlpt_client_posts = get_posts( array(
        'numberposts' => -1,
        'post_type' => 'mrlpt_client',
        'post_status' => 'any' ) );

    foreach ( $mrlpt_client_posts as $mrlpt_client_post ) {
        delete_post_meta( $mrlpt_client_post->ID, '_mrlpt_client_email' );
        delete_post_meta( $mrlpt_client_post->ID, '_mrlpt_client_phone_num' );
        wp_delete_post( $mrlpt_client_post->ID, true );
    }

}

mrlpt_delete_plugin();

Modifier:

J'ai essayé d'utiliser des requêtes SQL à la place, et encore une fois, cela ne fonctionne pas très bien. Je travaille dans une configuration multisite et les posts et les méta-données sont supprimés sur le site principal (wp_). Cependant, le deuxième site (wp_4_) ne fonctionne pas, rien n'est supprimé.

Qu'est-ce qui me manque pour que cela fonctionne dans le multisite? C'est très étrange car j'ai une autre requête SQL dans mon fichier de plugin principal pour remplir dynamiquement un champ déroulant dans un formulaire et cela fonctionne bien.

global $wpdb; // Must have this or else!

$postmeta_table = $wpdb->postmeta;
$posts_table = $wpdb->posts;

$wpdb->query("DELETE FROM " . $postmeta_table . " WHERE meta_key = '_mrlpt_client_email'");
$wpdb->query("DELETE FROM " . $postmeta_table . " WHERE meta_key = '_mrlpt_client_phone_num'");
$wpdb->query("DELETE FROM " . $posts_table . " WHERE post_type = 'mrlpt_client'");

Éditer 2:

Coder en dur dans le préfixe du deuxième site (wp_4_) au lieu d’utiliser $ wpdb, il efface ensuite les publications et les métadonnées de la base de données. Mais, évidemment, je ne peux pas coder en dur cela.

Des idées sur ce qui se passe ici? Je suis vraiment perplexe.

1
CourtFantinato

Je viens de trouver ceci dans une recherche et je pensais que je répondrais au cas où vous ne l'auriez pas compris.

Je ne suis pas sûr à 100% de la meilleure façon de s'y prendre mais je peux fournir des informations qui pourraient être utiles.

$ wpdb a à la fois les membres prefix et préfixe_base, vous pouvez donc obtenir le 'wp_4_' en référençant $ wpdb-> prefix et en l'utilisant dans votre requête.

Compte tenu de ce que vous avez, vous pouvez faire une chaîne de remplacement sur $ postmeta_table et $ posts_table afin que, s'ils sont définis sur wp_ au lieu de votre préfixe (dans ce cas, 'wp_4_'), remplacez-les et exécutez votre requête.

Ce serait quelque chose comme:

global $wpdb; // Must have this or else!

$postmeta_table = $wpdb->postmeta;
$posts_table = $wpdb->posts;

$postmeta_table = str_replace($wpdb->base_prefix, $wpdb->prefix, $postmeta_table);
$postmeta_table = str_replace($wpdb->base_prefix, $wpdb->prefix, $postmeta_table);

$wpdb->query("DELETE FROM " . $postmeta_table . " WHERE meta_key = '_mrlpt_client_email'");
$wpdb->query("DELETE FROM " . $postmeta_table . " WHERE meta_key = '_mrlpt_client_phone_num'");
$wpdb->query("DELETE FROM " . $posts_table . " WHERE post_type = 'mrlpt_client'");    

Encore une fois, je ne suis pas sûr que ce soit la meilleure façon de le faire, mais cela devrait vous amener là où vous essayez d'aller.

Références:

1
MagicalCodeMonkey