web-dev-qa-db-fra.com

Conditionnel add_filter?

Je dois appliquer un add_filter à partir de mon functions.php, mais uniquement si l'utilisateur a ouvert le fichier media-upload.php à partir de ma fonction personnalisée. Est-il possible d'envoyer une variable lors de l'ouverture de media-upload.php que je pourrais ensuite tester avant d'exécuter add_filter?

Exemple: Voici le code dans lequel j'ouvre l'éditeur de média à partir de mon icône personnalisée ...

//Custom upload launcher for custom attachments
function wpe_customImages($initcontext)
{
    global $post;
    ?>
<script type="text/javascript">
jQuery(document).ready(function() {
    var fileInput = '';

    jQuery('#customAttachments').click(function() {
        fileInput = jQuery(this).prev('input');
        formfield = jQuery('#upload_image').attr('name');
        post_id = jQuery('#post_ID').val();
        tb_show('', 'media-upload.php?post_id='+post_id+'&amp;type=image&amp;TB_iframe=true');
        return false;
    });

});
</script>
    <?php
    return $initcontext. 
    '<input type="hidden" id="post_ID" value="'. $post->ID .'" />
    Product Images:<a id="customAttachments" href="javascript:;" 
    class="mceButton mceButtonEnabled" onmousedown="return false;" 
    onclick="return false;">
    <img src="'.get_bloginfo('template_directory') .'/img/upload-icon.gif"" /></a>';
}
add_filter('media_buttons_context', 'wpe_customImages');

Dans le code ci-dessus, serait-il possible de définir une variable globale ou un marqueur que je peux tester pour exécuter mon code add_filter?

 if(isset($myMarker)){
  add_filter("attachment_fields_to_save", "rt_image_attachment_fields_to_save", null , 2);
  }
2
Scott B

D'après l'apparence de votre code, cliquer sur le champ #customAttachments déclenche un événement jQuery qui appelle une méthode tb_show() pour charger le fichier media-upload.php avec certains paramètres GET déjà définis (post_id, type, TB_iframe). Ce que vous pourriez faire, c’est ajouter un autre paramètre GET et vérifier s’il est défini afin d’exécuter votre code add_filter().

Alors:

tb_show('', 'media-upload.php?post_id='+post_id+'&amp;type=image&amp;TB_iframe=true');

Devient:

tb_show('', 'media-upload.php?post_id='+post_id+'&amp;type=image&amp;TB_iframe=true&amp;myMarker=true');

Ensuite, vous pouvez utiliser:

if(isset($_GET['myMarker'])){
    add_filter("attachment_fields_to_save", "rt_image_attachment_fields_to_save", null , 2);
}
3
EAMann

Même cette question a déjà une réponse acceptée, je vais essayer de donner une réponse plus large au problème.

Si vous voulez obtenir le nom de la page demandée par l'utilisateur , une variable globale la stocke: $pagenow. Cela fonctionne à la fois dans la zone administrative et sur le site Web (page d'accueil). Cette variable globale est toujours définie (elle est initialisée lorsque wp-includes/vars.php est inclus, ce qui est effectué par wp-settings.php, donc directement lorsque votre fichier wp-config.php est chargé (à la fin d'être précis)).

Ainsi, si le fichier media-upload.php est demandé, $pagenow sera défini sur "media-upload.php".

Donc, vous pouvez déjà le vérifier simplement:

if ('media-upload.php' === $pagenow ) { ... do your stuff ... }

Pour améliorer cela plus loin, pensez à enregistrer votre filtre uniquement lorsque vous en avez vraiment besoin. Cela aide à garder la fonction de filtre réelle "sur le sujet". Et par là, réduit la complexité qui est toujours bonne. Vous n'avez pas posté le code de votre fonction wpe_customImages(), mais tenez compte des points suivants. J'ai écrit cela en tant que classe, mais cela fonctionne aussi avec des fonctions globales:

class ConditionalFilterPlugin {
    public function __construct() {
        add_filter('init', array($this, 'init'));
    }
    public function init() {
        if ('media-upload.php' === $GLOBALS['pagenow'])
            add_filter('media_buttons_context', array($this, 'customImages'))
            ;
    }
    public function customImages() {
        // your hook function's code that does not need a conditional any longer.
    }
}
$ConditionalFilterPlugin = new ConditionalFilterPlugin();

Ce stub enregistre une seconde fonction sur le hook init. Le hook init est appelé lorsque wordpress est "prêt à être utilisé", ce qui signifie que vous pouvez utiliser la plupart des offres de l'API wordpress.

Dans la fonction init(), les conditions préalables pour enregistrer la fonction customImages() sont vérifiées avant de l’enregistrer. Cela vous évite non seulement de retirer la décision de votre rappel de hook, mais vous permet également de réutiliser la fonction de rappel ailleurs.

3
hakre