web-dev-qa-db-fra.com

Où accrocher register_settings pour l'API de paramètres lorsque vous souhaitez également mettre à jour des options en dehors de l'API de paramètres?

L'API Paramètres est un moyen pratique d'ajouter des options administratives. Des tutoriels sur les paramètres de l’API raccordent register_setting à admin_init. Mais que se passe-t-il si vous souhaitez également modifier par programme les mêmes options en dehors de l'API de configuration?

Par exemple, utilisez l'API Settings pour gérer une valeur de base pour l'option X. De plus, chaque nouvelle publication incrémente automatiquement l'option X via un appel direct à la fonction update_option. Malheureusement, si l'option X est enregistrée, update_option déclenche un appel à la fonction de validation associée au paramètre enregistré. La validation échoue parce que l'argument update_option n'est pas passé parce que je bousille les différentes validations requises des différentes sources de changement d’options.

Où register_setting pour l'option X doit-il être connecté pour permettre à l'option X d'être également mise à jour en dehors de l'API Settings? Sinon, où unregister_setting pour l'option X doit-il être raccordé pour permettre à l'appel direct update_option de fonctionner sans l'appel de la fonction de validation/validation de l'API Settings?

Mise à jour: t31os below a utilement fourni du code illustratif. Voici un petit ajout à son code:

    function __construct() {
        add_action( 'admin_init', array( $this, 'admin_init' ) );
        add_action( 'admin_menu', array( $this, 'admin_menu' ) );
        add_action('add_meta_boxes', array( &$this, 'add_regtest_box' )); //added hook
        }   

//added functions
    function add_regtest_box() {
            global $post;
            add_meta_box( 'regtest_box', 'Registered Setting Test', array( &$this, 'regtest_box_contents'), 'post' , 'side' , 'high' );
        }   
    function regtest_box_contents() {
            update_option( 'test-option', array('fieldone'=>-11,'fieldtwo'=>8) );
            $new_vals = get_option( 'test-option' );
            print_r( $new_vals );
        }

Si vous "ajoutez une nouvelle publication" à partir du tableau de bord, vous remarquerez que la métabox située en haut à droite indique fieldone avec une valeur de 11, et non de -11. En effet, l'appel de la fonction update_option de regtest_box_contents place les valeurs d'option via la fonction de nettoyage/validation enregistrée (register_setting) dans l'option. Dans ce cas, il s'agit de la fonction update_option de t31os, qui applique absint () à la valeur d'option transmise. La question est de savoir comment éviter cet appel de fonction, par exemple juste avoir l'option mise à jour à -11.

3
BigToe

Maintenant, j'y ai pensé (Mark, c'est moi, j'utilise un autre compte quand je suis à d'autres endroits). L'enregistrement d'un paramètre consiste à préparer options.php à accepter les données de votre formulaire entrant lorsqu'un nonce valide est présent. et fournit également un moyen de lier une méthode de désinfection à la soumission de ces données. C'est vraiment une chose pratique pour les plugins, et autres ..

Depuis le début du site, il devrait être parfaitement correct d'appeler update_option et de vous en servir. Il n'est pas nécessaire de s'enregistrer au départ car vous ne soumettez pas les données de formulaire à options.php comme vous le feriez pour une page d'administration.

J'ai essayé de reproduire votre problème, mais je n'ai pas pu, voici mon code de test moche pour créer une page enregistrée simple qui peut enregistrer des options.

class RegisteredSettingsTest {
    private $page;
    private $name = 'test-option';
    private $options;
    function __construct() {
        add_action( 'admin_init', array( $this, 'admin_init' ) );
        add_action( 'admin_menu', array( $this, 'admin_menu' ) );
    }
    function admin_init() {
        register_setting( 'setting_ref', $this->name, array( $this, 'update_option' ) );
        $this->options = get_option( $this->name );
    }
    function admin_menu() {
        $this->page = add_dashboard_page( 'Test','Test','manage_options','translatable_demo', array( &$this , 'load' ) );
    }
    function update_option( $data ) {
        $clean = array_map( 'absint', $data );
        unset($data);
        return $clean;
    }
    function load() {
        ?>
        <div class="wrap">
            <?php screen_icon('index'); ?>
            <h2>Test</h2>
            <form action="options.php" method="post">
                <?php settings_fields( 'setting_ref' ); ?>
                <p><label for="<?php $this->field_name( 'fieldone') ?>">Field one <input value="<?php $this->get_option( 'fieldone') ?>" name="<?php $this->field_name( 'fieldone') ?>" type="text" /></label></p>
                <p><label for="<?php $this->field_name( 'fieldtwo') ?>">Field two <input value="<?php $this->get_option( 'fieldtwo') ?>" name="<?php $this->field_name( 'fieldtwo') ?>" type="text" /></label></p>
                <p class="submit"><input type="submit" name="Submit" class="button-secondary action" value="Save" /></p>
            </form>
            <!-- Output options data, so we can see how it currently looks -->
            <pre><?php print_r( $this->options ) ?></pre>
        </div>
        <?php
    }
    function field_name( $name, $echo = true ) {
        $name = "{$this->name}[$name]";
        if( $echo )
            echo $name;
        else
            return $name;
    }
    function get_option( $name, $echo = true ) {
        $val = '';
        if( is_array( $this->options ) && isset( $this->options[$name] ) )
            $val = $this->options[$name];

        if( $echo )
            echo $val;
        else
            return $val;
    }
}
$r = new RegisteredSettingsTest;

J'ai chargé la page vers le haut, entré les valeurs 1 et 2 dans les champs et appuyé sur Enregistrer (ce qui fonctionne bien, et je vois les valeurs 1 et 2). J'utilise des valeurs numériques, car il ne s'agit que d'un simple test.

Le test le plus simple que j'ai pu faire avant était simplement d'appeler update_option dans mon single.php (bien que j'aurais pu utiliser n'importe quel autre fichier de modèle).

update_option( 'test-option', array('fieldone'=>3,'fieldtwo'=>4) );

S'il y avait un problème, je devrais quand même voir les valeurs 1 et 2 lorsque je chargerai ma page d'administration de test. Malheureusement, ce n'est pas le cas, les nouvelles valeurs, 3 et 4, sont affichées.

Pouvez-vous publier le code que vous utilisez pour mettre à jour l’option depuis le début? Si c'est à l'intérieur d'un rappel, postez la fonction entière, plus l'action/le filtre sur lequel elle est accrochée, s'il vous plaît .. :)

UPDATE:

Supprimez le rappel de désinfection avant de mettre à jour l'option.

remove_all_filters( 'sanitize_option_test-option', 10 );

Et vos valeurs ne seront plus écrasées par la fonction de rappel, car elles seront décrochées .. :)

0
t31os

Ne pourriez-vous pas simplement déclencher votre action sur init?

La nécessité de mettre à jour les options est toujours la même (seuls les administrateurs peuvent manage_options), donc cela devrait fonctionner en théorie, avez-vous essayé, était-ce un problème?

Pas sur mon PC principal en ce moment, sinon je le tenterais moi-même pour voir si ça marche.

Que voulais-tu dire ici ..

La validation échoue car l'argument update_option n'est pas transmis.

J'aurais demandé dans un commentaire, mais je n'ai pas encore atteint l'exigence de représentant pour ce compte.

1
Mark Duncan

Sur une note de bas de page ... ne serait-il pas préférable de compter les postes pertinents, puis d'ajouter la valeur de base parmi vos options pour obtenir le total? (Si c'est vraiment ce dont vous avez besoin.) À moins que vous ne souhaitiez créer une interface de paramètres disponible à partir du serveur frontal, cela semble indiquer que vous devriez le faire de manière différente. Je pense qu'il peut être déroutant pour l'utilisateur si leurs "paramètres" changent d'eux-mêmes?

0
wyrfel