Actions ou filtres déclenchés lorsque des données sont enregistrées dans un tableau personnalisé

4

J'utilise un plugin et j'essaie de renseigner automatiquement un champ personnalisé (liste déroulante) pour le formulaire d'abonné, car il devrait répertorier des données dynamiques (liées au contenu du site Web).

Le plugin n'a, à ce que je sache, aucun filtre ni action à cet effet. Cela me force à penser par tous les moyens possibles pour y faire face.

Le plugin utilise des tables personnalisées (et non des tables natives / intégrées à WP). Je me demandais donc si une action ou un filtre était déclenché lorsque des données étaient enregistrées dans l'une de ces tables personnalisées.

    
posée Capiedge 05.03.2017 - 13:50

1 réponse

4

Le plugin a probablement (ou, espérons-le) utilisé l'objet $wpdb , une instance de wpdb -class, pour ajouter la table personnalisée. Si tel est le cas (et seulement si tel est le cas), son auteur utilise probablement aussi $wpdb->insert() pour ajouter lignes / à la table.

Jetez un coup d'œil à wpdb::insert() , puis consultez son source , vous découvrirez que cette méthode est juste un wrapper de commodité autour de wpdb::_insert_replace_helper() , qui définit l’argument $type sur INSERT . Bien que cette méthode N'A PAS de filtre, la source révèle que cette fonction utilise réellement

.
return $this->query( $this->prepare( $sql, $values ) );

Bien que wpdb::prepare() n'autorise aucune modification via des filtres, jetons un coup d'œil à wpdb::query() . Vous y trouverez le filtre suivant:

$query = apply_filters( 'query', $query );

Maintenant que nous avons un point d’entrée , où nous pouvons ajouter des modifications, voyons comment identifier le tableau personnalisé rempli de données. En regardant l’instruction SQL intégrée à l’instruction d’exécution, vous remarquerez la ligne suivante:

$sql = "$type INTO '$table' ($fields) VALUES ($formats)";

La variable $table provient de la définition de la fonction, qui est le premier argument de l'appel $wpdb->insert() . Normalement, tout développeur sain utilisera "{$wpdb->prefix}custom_table_name" ici pour éviter un plugin cassé si le préfixe de la table était remplacé par wp_ dans wp-config.php .

Enfin:

<?
/* Plugin Name: Do something when a custom table gets data added or altered */
add_filter( 'query', function( $query ) {
    // Return SQL unmodified. Not the table we are targeting.
    if ( false === strstr( $query, "{$wpdb->prefix}custom_table_name" ) ) {
        return $query;
    }

    // Return SQL unmodified. Not the actions we are targeting.
    # @TODO If you only want to act on either of them, modify the if-clause
    if ( 
        false === strstr( $query, "INSERT" ) 
        AND false === strstr( $query, "REPLACE" )
    ) {
        return $query;
    }

    # @TODO Do your custom task here and…
    # …modify according the query to your likings.

    return $query;
} );

N'oubliez pas que ce plug-in s'exécute maintenant sur chaque requête . Vous voudrez peut-être ajouter des vérifications telles que is_admin() et envelopper tout le bloc de code dans une fonction attachée à un hook plus exclusif pour en réduire le nombre d'exécutions. Sinon, vous risquez de ralentir considérablement votre site.

    
réponse donnée kaiser 05.03.2017 - 15:12

Lire d'autres questions sur les étiquettes