Ondersteuning » Code oplossingen gezocht » 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 - 1 tot 15 (van in totaal 35)
  • Bekijk dit artikel eens, deze verwijderd de custom taxomony en terms.
    Hopelijk een antwoord op je vraag.
    Grtjs, Danny

    Thread starter Guido

    (@guido07111975)

    Hoi Danny,

    Bedankt voor je reactie.
    Ik wil het perse via uninstall.php laten verlopen.

    Als ik bijvoorbeeld de ID vd term in mijn uninstall.php zet:

    wp_delete_term( 25, 'event_cat' );

    Is term 25 keurig verwijderd na de-installatie plugin.
    Dus mijn basis werkt. Alleen die query wil maar niet lukken..

    Guido

    Ik hoop dat je deze query bedoeld, die daar beschreven staat:

    global $wpdb;
    $wpdb->query( "DROP TABLE IF EXISTS {$wpdb->prefix}mytable" );

    Zo ja, kan je deze code gebruiken:

    global $wpdb;
       $table = $wpdb->prefix."je_tabel_naam";
       //Verwijder nu de tabel die je met $table hebt gedefinieerd
       $wpdb->query("DROP TABLE IF EXISTS $table");

    Bedoelde je toch iets anders, dan hoor ik het graag van je.

    Grtjs, Danny

    Thread starter Guido

    (@guido07111975)

    Hoi Danny,

    Het is geen table, dus dat gaat niet werken.
    Terms staan (uiteraard) wél in een table: wp_terms

    Guido

    Dag Guido,

    Probleem is dat je de term ‘event_cat’ eerst in een array() dient te zetten (hier als $my_term ).
    De argumenten dien je dan ook in een array() te zetten (hier als $args )
    Gebruik daarna get_terms om deze op te zoeken en verwijder deze terwijl je ze leest met foreach.

    add_action('wp_footer', 'wud_del_terms');
    function wud_del_terms()
    {
        $my_term = 'event_cat';
        $del_terms= array($my_term );
        $args = array(
            'hide_empty' => false,
            'fields' => 'ids',
        );
    
      $terms = get_terms( $del_terms, $args );
       foreach( $terms as $term_id ) {
          wp_delete_term($term_id, $my_term );
      }
    }

    Zou normaal moeten lukken met deze code.
    Sorry voor het misverstand.

    Grtjs, Danny

    Thread starter Guido

    (@guido07111975)

    Hoi Danny,

    Ook dit heeft weer geen effect: alle terms blijven in database staan.

    Ik heb toen dit voorbeeld gevolgd en het werkt wel: terms verwijderd toen ik plugin activeerde.

    Echter, als ik dit in uninstall.php plaats (met action wp_footer ipv init), werkt het niet.

    Dus het heeft te maken met de wijze waarop uninstall.php werkt.

    Guido

    Hoi Guido,

    Maak er dan een een functie van met variabele, die je enkel oproept in je uninstall.php

    Idem code als hierboven met volgende wijziging:

    function wud_del_terms($my_term ) {
        $del_terms= array($my_term );
        $args = array(
            'hide_empty' => false,
            'fields' => 'ids',
        );
    
        $terms = get_terms( $del_terms, $args );
         foreach( $terms as $term_id ) {
            wp_delete_term($term_id, $my_term );
         }
    }
    
    wud_del_terms('event_cat');

    Grtjs, Danny

    Je kan dit uiteraard ook met je voorbeeld:

    function sjc_delete_terms($my_term) {
         if ( is_admin() ) {
              $terms = get_terms( $my_term, array( 'fields' => 'ids', 'hide_empty' => false ) );
              foreach ( $terms as $value ) {
                   wp_delete_term( $value, $my_term );
              }
         }
    }
    
    sjc_delete_terms('event_cat');
    //of zoals in het voorbeeld aangegeven:
    sjc_delete_terms('category');
    Thread starter Guido

    (@guido07111975)

    Hoi Danny,

    Thanks. Ik ga het vanavond proberen (nu geen testomgeving bij de hand).

    FF een vraagje over beide voorbeelden van je.
    Het eerste argument in ‘get_terms’ moet de betreffende taxonomie zijn (event_cat). In jouw voorbeeld zie ik ‘my_term’ staan.
    De taxonomie wordt echter helemaal niet aangeroepen, maar pas helemaal aan het einde. Zie ik dat correct?

    Enig idee waarom een ‘add_action’ in uninstall.php niet werkt? Zou met verwijderen van plugin te maken kunnen hebben?

    Guido

    Thread starter Guido

    (@guido07111975)

    Ho Danny,

    Helaas nog steeds niets. Ik krijg steeds sterker het vermoeden dat het script niet uitgevoerd wordt in een uninstall.php
    Want mijn en jouw code snippets werken prima wanneer ik ze uitvoer bij activatie van plugin: alle terms (event categorieën) die onder event_cat (taxonomie) vallen zijn verwijderd uit wp_terms table.

    Guido

    Oké, nu hebben we een andere weg af te leggen 🙂
    Vraagje en doe opdracht.
    Maak een unistall.php en zet er volgende code in:

    <?php
    if ( !defined( 'WP_UNINSTALL_PLUGIN' ) )
        exit();
    echo "Eerste".date(‘h:i:s’) . "n";
    usleep(5000000);
    // back!
    echo "Tweede".date(‘h:i:s’) . "n";
    usleep(5000000);
    ?>

    Lijkt een dom iets, maar dan weten we tenminste of je uninstall draait …

    Thread starter Guido

    (@guido07111975)

    Hoi Danny,

    Allereerst, ik waardeer het dat je me zo goed meehelpt 🙂

    Ik weet zeker dat mijn unistall.php werkt bij de-installatie, want de andere commands worden gewoon uitgevoerd: alle custom posts (events) worden verwijderd en alle custom meta (options) wordt ook verwijderd uit wp_options table.

    Misschien ook voor jou handig, dit is een link van de plugin.

    Maak maar eens een event categorie aan, voeg jouw of mijn code toe in uninstall.php, ga naar wp_terms table en zie dat event categorie (helaas) niet verwijderd wordt na de-installatie.

    Guido

    Thread starter Guido

    (@guido07111975)

    Ik kom dit in een andere plugin tegen, om alle (custom?) Terms & Taxonomies te verwijderen:

    $terms = $wpdb->get_results( $wpdb->prepare( "SELECT t.*, tt.* FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id WHERE tt.taxonomy IN ('%s') ORDER BY t.name ASC", $taxonomy ) );
    
    // Delete Terms.
    if ( $terms ) {
    	foreach ( $terms as $term ) {
    		$wpdb->delete( $wpdb->term_taxonomy, array( 'term_taxonomy_id' => $term->term_taxonomy_id ) );
    		$wpdb->delete( $wpdb->terms, array( 'term_id' => $term->term_id ) );
    	}
    }

    Een hele andere benadering..

    Guido

    Oké nu hebben we een beter overzicht 🙂

    Wat je nodig hebt zijn 3 dingen

    1 – eerst verzamelen wat je event_cat (id’s) in een array()
    $wpdb->get_results("SELECT taxonomy FROM $wpdb->term_taxonomy WHERE taxonomy = ('event_cat')");

    2 – we verwijderen dan de terms volgens eerdere array() (id’s)
    $wpdb->query( "DELETE FROM {$wpdb->terms} WHERE term_id = ".$id_van_array."" );

    3 – en uiteraard ook je taxonomy’s ‘event_cat’ verwijderen
    $wpdb->query( "DELETE FROM {$wpdb->term_taxonomy} WHERE taxonomy = 'event_cat'" );

    Punt is dat er 2 tabellen dienen aangesproken worden om dit te kunnen ‘opruimen’.

    Indien gewenst, kan ik je dit vanavond wel even schrijven.
    Grtjs, Danny

    Thread starter Guido

    (@guido07111975)

    Hoi Danny,

    Graag!
    Ik vind dit maar (erg) lastig, als ik een term aankies in table wp_terms zie ik ook nergens een directe verwijzing naar taxonomie ‘event_cat’.

    Het verwijderen van taxonomie ‘event_cat’ was me zelf ook al gelukt:

    // Delete taxonomy
    $wpdb->query( "DELETE FROM {$wpdb->term_taxonomy} WHERE taxonomy = 'event_cat'" );

    Guido

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