web-dev-qa-db-fra.com

Comment filtrer dans les métadonnées post avant de sauvegarder

Je suis sur un plugin, où je veux fournir un moyen à mes clients de filtrer les données avant de sauvegarder. Je sais que le meilleur moyen est de fournir un crochet de filtre. J'ai donc introduit un nouveau crochet de filtrage pour filtrer toutes les données de publication, y compris les données de publication et les métadonnées.

Mais j’ai trouvé que, il existe déjà un hook disponible pour les données postales . J'ai donc compris qu'il était inutile d'introduire un autre point d'ancrage pour filtrer les données de publication.

Maintenant, je me demande si un tel crochet est disponible pour les métadonnées post? Si tel est le cas, je n'aurai pas besoin de fournir de nouveau hook de filtrage, je peux diriger mes utilisateurs vers ces hooks de filtrage du noyau.

J'ai trouvé un article deIgor Benicsur le filtre de métadonnées . J'ai essayé avec le code suivant et certaines de ses variantes:

function wpse22728_meta($check, $object_id, $meta_key, $meta_value, $unique) {
    if( get_post_type($object_id) == 'mycpt' ) {
        if( $meta_key == 'mycustomkey' ) {
            // var_dump($meta_value); //value going to store is: 'old_value'
            return $meta_value = 'new_value';
        }
    }
}

add_filter('add_post_metadata', 'wpse22728_meta', 20, 5);
add_filter('update_post_metadata', 'wpse22728_meta', 20, 5);

Mais effectivement échoué.

Comment puis-je filtrer les métadonnées avant de les stocker? Y a-t-il un autre crochet disponible?

1
Abirvab

Les filtres add_post_metadata et update_post_metadata permettent de filtrer uniquement si une métadonnée spécifique doit être enregistrée (ajoutée/mise à jour) ou non. La valeur par défaut (de $check) est une null et si vous renvoyez un élément autre queexactementnull (c'est-à-dire !== null), les métadonnées ne seront pas enregistrées (dans la base de données).

Cependant, la fonction add_metadata() (utilisée par add_post_meta()) et la fonction update_metadata() (utilisée par update_post_meta()) utilisent toutes deux sanitize_meta() pour assainir la méta-valeur (bien que l'assainissement se fasse via les filtres etnotla fonction elle-même) , et le Codex dit:

Applique des filtres pouvant être connectés pour effectuer des procédures de nettoyage spécifiques pour le type et la clé de métadonnées particuliers. Ne désinfecte rienseul. Des filtres personnalisés doivent être associés pour effectuer le travail. La balise de crochet de filtre se présente sous la forme "sanitize_{$meta_type}_meta_{$meta_key}".

Ainsi, dans votre cas, le $meta_type serait post et $meta_key serait mycustomkey et vous pourriez filtrer la valeur comme suit:

add_filter( 'sanitize_post_meta_mycustomkey', function( $value ){
    return 'new_value';
} );

Vérifiez également ce exemple .

Inconvénient

Malheureusement, la fonction sanitize_meta() ne transmet pas l’ID "objet" (par exemple, poste ou utilisateur) aux filtres de désinfection (c.-à-d. Les fonctions raccordées à sanitize_{$meta_type}_meta_{$meta_key}).

Il y a un moyen de surmonter cela, mais cela dépend de votre code/contexte, je ne peux donc pas expliquer le "comment".

METTRE À JOUR

En fait, il existe une solution délicate (ou hacky?), Qui fonctionne bien avec les filtres add_post_metadata et update_post_metadata. Mais je n’inclus pas (encore) le code, et vous pouvez le trouver sur Pastebin .

2
Sally CJ