Ondersteuning Volgende » Code oplossingen gezocht Volgende » Verwijder terms na de-installatie plugin

  • Opgelost Guido

    (@guido07111975)


    Hallo,

    Een plugin maakt een custom post type (= taxonomy) aan: event_cat.
    Hierdoor kan ik event categorieën (= terms) aanmaken.

    Als ik plugin verwijder moet de database natuurlijk wel geschoond worden, de terms moeten uit database verwijderd worden.

    Hiervoor gebruik uninstall.php en deze code:

    // Delete terms
    $terms = get_terms( 'event_cat', array(
    	'fields' => 'ids',
    	'hide_empty' => false
    ) );
    foreach ( $terms as $value ) {
    	wp_delete_term( $value, 'event_cat' );
    }

    Echter, de terms blijven gewoon in database achter..

    Wat klopt er niet aan deze code?

    Guido

15 reacties aan het bekijken - 16 tot 30 (van in totaal 35)
  • De taxonomie ‘event_cat’ zijn ID is steeds dezelfde ID als deze van de terms.

    taxonomie ‘event_cat’ = ID 1
    term ‘eigen naam’ = ID 1

    taxonomie ‘event_cat’ = ID 2
    term ‘andere naam naam’ = ID 2

    Hierdoor kan WP ook de link leggen tussen de naam en soort taxonomie.

    Ben pas na 21:00 thuis, maar zal dit voor je maken 😉

    Guido

    (@guido07111975)

    Hoi Danny,

    Dat zou heel mooi zijn!

    Toch vreemd dat alle code snippets die we tot nu toe hebben getest niet werken in een unistall.php, maar als je dezelfde code snippets in de functions/settings file van je plugin zet en de plugin activeert/de-activeert het wél werkt.

    Guido

    Hier alvast je werkende code (kan nog fijner gemaakt worden, maar het werkt 🙂 )

    <?php
    // If uninstall is not called from WordPress, exit
    if ( !defined( 'WP_UNINSTALL_PLUGIN' ) ) {
    exit();
    }
    //This file needs to load 'wp-load.php' again
    
    require_once( $_SERVER['DOCUMENT_ROOT'].'/wp-load.php' );
    
    // Delete custom post meta
    delete_post_meta_by_key( 'event-date' );
    delete_post_meta_by_key( 'event-date-hide' );
    delete_post_meta_by_key( 'event-time' );
    delete_post_meta_by_key( 'event-location' );
    delete_post_meta_by_key( 'event-link' );
    delete_post_meta_by_key( 'event-link-label' );
    
    global $wpdb;
    //Set the taxomony ID's in an Array()
    	function wud_get_term_by_tax($wud_id) {
    			global $wpdb;
    
    			$tt_details = array();
    			$tt_details_results = $wpdb->get_results("SELECT * FROM {$wpdb->term_taxonomy} WHERE taxonomy = ('event_cat')");
    
    			foreach( $tt_details_results as $result )
    				$tt_details[] = $result->term_taxonomy_id;
    			return $tt_details;
    
    	}
       $my_terms=wud_get_term_by_tax($wud_id);
    
    //Delete the terms by ID from wud_get_term_by_tax()
    	foreach ( $my_terms as $taxonomy ) {
    		$wpdb->query( "DELETE FROM {$wpdb->terms} WHERE term_id = ".$taxonomy."" );
    	}
    
    //Delete now the taxomony's called 'event_cat'
    	$wpdb->query( "DELETE FROM {$wpdb->term_taxonomy} WHERE taxonomy = 'event_cat'" );
    
    ?>

    De reden waarom het niet wekt is vrij eenvoudig, hooks werken niet in een uninstall.php.
    Waarom bovenstaande wel werkt?
    We doen het volgende:
    1 zoek alle taxomonys met ‘event_cat’ en onthouden hun ID in een array
    2 delete nu alle terms die dezelfde ID hebben als de taxomony.
    3 verwijder de taxomonys met ‘event_cat’

    Koppeling tussen de 2 is dus de ID van beide.

    Guido

    (@guido07111975)

    Hoi Danny,

    Werkt het bij jou? Bij mij helaas nog steeds niet.
    Ik test alles lokaal (WampServer), zag op het www dat er dan soms wat gedoe is met de ‘document root’..

    Guido

    Heb de code opgepoetst, maar functionaliteit blijft hetzelfde en werkt.
    Een voorbeeld met screenshots heb je hier.

    De enigste fout die ik kreeg in de log files was deze:
    PHP Notice: Undefined variable: wud_id in ………/wp-content/plugins/very-simple-event-list/uninstall.php on line 28

    Deze heb ik dan als global gezet wat de oplossing was.

    De volgende is verwijderd (was niet nodig):
    require_once( $_SERVER['DOCUMENT_ROOT'].'/wp-load.php' );

    Dus dit is hier het werkend script met DEBUG aangezet in WP om fouten te onderscheppen:

    <?php
    // If uninstall is not called from WordPress, exit
    if ( !defined( 'WP_UNINSTALL_PLUGIN' ) ) {
    exit();
    } 
    
    // Delete custom post meta
    //delete_post_meta_by_key( 'event-date' );
    delete_post_meta_by_key( 'event-date-hide' );
    delete_post_meta_by_key( 'event-time' );
    delete_post_meta_by_key( 'event-location' );
    delete_post_meta_by_key( 'event-link' );
    delete_post_meta_by_key( 'event-link-label' );
    
    global $wpdb, $wud_id;
    //Set the taxomony ID's in an Array()
    	function wud_get_term_by_tax($wud_id) {
    			global $wpdb;
    
    			$tt_details = array();
    			$tt_details_results = $wpdb->get_results("SELECT * FROM {$wpdb->term_taxonomy} WHERE taxonomy = ('event_cat')");
    
    			foreach( $tt_details_results as $result )
    				$tt_details[] = $result->term_taxonomy_id;
    			return $tt_details;
    
    	}
       $my_terms=wud_get_term_by_tax($wud_id);
    
    //Delete the terms by ID from wud_get_term_by_tax()
    	foreach ( $my_terms as $taxonomy ) {
    		$wpdb->query( "DELETE FROM {$wpdb->terms} WHERE term_id = ".$taxonomy."" );
    	}
    
    //Delete now the taxomony's called 'event_cat'
    	$wpdb->query( "DELETE FROM {$wpdb->term_taxonomy} WHERE taxonomy = 'event_cat'" );
    ?>

    Alles wordt netjes verwijderd, dus dit zou ook bij u moeten lukken.
    Grtjs, Danny

    Guido

    (@guido07111975)

    Ik zie de prints en hij verwijderd inderdaad alles bij jou… alleen bij mij nog steeds niet. Heb meerdere keren getest en ook steeds nieuwe event categorieën aangemaakt.

    Maar zoals gezegd doe ik alles lokaal, dus heb het toen niet-lokaal gedaan en nu werkt het inderdaad! Eindelijk! Gelijk ook even de eerdere code snippets getest en die werken allemaal definitief niet.

    Zou het kunnen komen door het gebruik van WampServer?

    Guido

    Dit ‘zou’ kunnen, ik maak er nooit gebruik van …
    Met de error logs van mijn test website (via DirectAdmin) en DEBUG aan in WordPress ontwerp ik, geeft een realistisch beeld van wat je doet en hoe anderen het gaan ervaren.
    Waarom je WampServer bij een uninstall.php van WordPress geen eenvoudige SQL Query’s kan uitvoeren, is een goeie vraag …

    Slotconclusie: de laatste code werkt zoals het hoort, maar niet op je WampServer, wat in principe een andere vraag is dan je oorspronkelijk hebt gesteld en dien je lokaal dieper te loggen wat er op je WampServer fout gaat.

    Volgens mij is dit topic opgelost 🙂

    Mensen die het resultaat van de code willen bekijken en downloaden kunnen dit hier.

    Guido

    (@guido07111975)

    Hoi Danny,

    Ik ben erg blij dat dit nu eindelijk opgelost is.

    Ga nog wel even op zoek naar de reden waarom dat andere allemaal niet in uninstall.php werkt.

    Er lopen overigens veel gebruikers tegen dit probleem aan, kom er veel topics over tegen op het www. Had ook al eerder op het global forum een vraag over gesteld, zonder resultaat. Zal daar ff een link naar dit topic plaatsen.

    Heel erg bedankt, can I buy you a beer?

    Guido

    Graag gedaan hoor Guido,

    De reden is vermoedelijk omdat deze een hook zoals hieronder niet werkt in uninstall.php:

    add_action('wp_footer', 'wud_del_terms');
    function wud_del_terms()
    {
    .... .....
        );
    
    ..... ......
      }
    }

    Bij volgend voorbeeld (hier of hier) gebruiken ze ook geen hooks …
    Heel waarschijnlijk om dat de uninstall op zich al een hook is 🙂
    Grtjs, Danny

    Guido

    (@guido07111975)

    Hi Danny,

    Was deze pagina nog niet tegengekomen in mijn zoektocht vóórdat ik mijn eerste bericht plaatste, maar dit zou ook alle terms verwijderen:

    DELETE FROM
    wp_terms
    WHERE term_id IN
    ( SELECT * FROM (
        SELECT wp_terms.term_id
        FROM wp_terms
        JOIN wp_term_taxonomy
        ON wp_term_taxonomy.term_id = wp_terms.term_id
        WHERE taxonomy = 'event_cat'
    ) as T
    );

    Niet getest en ter info..

    Guido

    Zou ik zeker eerst even testen als ik u was, maar ziet er goed uit.
    Danny

    Guido

    (@guido07111975)

    Nope, krijg foutmelding:

    Parse error: syntax error, unexpected ‘FROM’ (T_STRING) in …

    Maar je hoeft je er niet wéér in te verdiepen hoor, ik gebruik jouw code gewoon..

    Guido

    Heb de unistall.php ook bij mijn nieuwe plugin gezet en wordt op deze manier alles netjes opgeruimd.

    De laatste MySQL opdracht werkt wel en is op een manier ook wel beter, uiteraard moet je daar enkele aanpassingen maken zoals het verwijzen naar de tabel: $wpdb->term_taxonomy ipv wp_term_taxonomy, e.a.

    Als je die echt werkend wil hebben, laat maar horen 🙂

    Grtjs, Danny

    Guido

    (@guido07111975)

    Hoi Danny,

    Tja.. die laatste is wel een stuk compacter en richt zich geheel op de mysql, dus daar gaat mijn voorkeur idd wel naar uit.. to be honest.

    Guido

    Ga straks even aan de slag 🙂

15 reacties aan het bekijken - 16 tot 30 (van in totaal 35)
  • Het onderwerp ‘Verwijder terms na de-installatie plugin’ is gesloten voor nieuwe reacties.