web-dev-qa-db-fra.com

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

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, à ma connaissance, aucun filtre ni action à cet effet. Cela me force à penser de manière alternative pour faire face à cela.

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

3
Capiedge

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

En regardant wpdb::insert() , et en regardant sa source , vous allez découvrez que cette méthode est simplement un encapsuleur pratique wpdb::_insert_replace_helper() , qui définit l’argument $type sur INSERT. Bien que cette méthode n’ait PAS de filtre , la source révèle que cette fonction utilise réellement

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

Alors 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é qui est rempli avec des données. En examinant 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.

Finalement:

<?
/* 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;
} );

Gardez à l'esprit que ce plugin s'exécute sur chaque requête maintenant. 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 pourriez ralentir votre site de manière significative.

3
kaiser