it-swarm.com.de

Wo kann man register_settings für die Einstellungs-API einbinden, wenn auch Optionen außerhalb der Einstellungs-API aktualisiert werden sollen?

Die Settings API ist eine bequeme Möglichkeit, Verwaltungsoptionen hinzuzufügen. Tutorials zum Einstellungs-API-Hook register_setting to admin_init. Was aber, wenn Sie dieselben Optionen auch außerhalb der Einstellungs-API programmgesteuert ändern möchten?

Verwenden Sie zum Beispiel die Einstellungs-API, um einen Basiswert für die Option X zu verwalten. Außerdem erhöht jeder neue Beitrag die Option X automatisch über einen direkten Funktionsaufruf update_option. Wenn Option X registriert ist, löst update_option leider einen Aufruf der Validierungsfunktion aus, die der registrierten Einstellung zugeordnet ist. Die Validierung schlägt fehl weil das Argument update_option nicht übergeben wird weil ich die unterschiedliche Validierung vermassele, die von den verschiedenen Quellen der Optionsänderung verlangt wird.

Wo sollte register_setting für Option X eingebunden werden, damit Option X auch außerhalb der Einstellungs-API aktualisiert werden kann? Wo sollte alternativ unregister_setting für Option X angehakt werden, damit der direkte update_option-Aufruf ohne den Funktionsaufruf Settings API sanitization/validation funktioniert?

Update: t31os below lieferte hilfreichen Code zur Veranschaulichung. Hier ist eine kleine Ergänzung zu seinem 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 );
        }

Wenn Sie im Dashboard einen neuen Beitrag hinzufügen, werden Sie feststellen, dass in der Metabox oben rechts ein Feld mit dem Wert 11 und nicht -11 angezeigt wird. Dies liegt daran, dass der Funktionsaufruf update_option in regtest_box_contents die Optionswerte über die Bereinigungs-/Validierungsfunktion, die für die Option registriert wurde (register_setting), verteilt. In diesem Fall ist dies die update_option -Funktion von t31os, die absint () auf den übergebenen Optionswert anwendet. Die Frage ist, wie dieser Funktionsaufruf vermieden werden kann, z. Habe nur die Option auf -11 aktualisiert.

3
BigToe

Jetzt habe ich darüber nachgedacht (Mark bin ich, ich benutze ein anderes Konto, wenn ich an einem anderen Ort bin). Alles, was Sie tun müssen, um eine Einstellung zu registrieren, ist, options.php vorzubereiten, um Ihre eingehenden Formulardaten zu akzeptieren, wenn eine gültige Nonce vorliegt und bietet auch eine Möglichkeit, eine Desinfektionsmethode an die Übermittlung dieser Daten zu binden. Es ist wirklich eine praktische Sache für Plugins und so weiter.

Vom vorderen Ende der Site sollte es vollkommen in Ordnung sein, einfach update_option aufzurufen und damit fertig zu sein. Es muss nicht im Frontend registriert sein, da Sie keine Formulardaten an options.php senden, wie Sie es für eine Administrationsseite tun würden.

Ich habe versucht, Ihr Problem zu replizieren, konnte es jedoch nicht. Hier ist mein hässlicher Testcode zum Erstellen einer einfachen registrierten Seite, auf der Optionen gespeichert werden können.

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;

Ich habe die Seite hoch geladen, die Werte 1 und 2 in die Felder eingegeben und auf Speichern geklickt (was natürlich gut funktioniert und ich sehe die Werte 1 und 2). Ich verwende numerische Werte, weil es nur ein einfacher Test ist.

Der einfachste Front-End-Test, den ich finden konnte, war, einfach update_option in meiner single.php aufzurufen (obwohl ich jede andere Vorlagendatei hätte verwenden können).

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

Wenn es ein Problem gab, sollte ich immer noch die Werte 1 und 2 sehen, wenn ich meine Testadministrationsseite hochlade. Leider ist das nicht der Fall, die neuen Werte 3 und 4 werden angezeigt.

Können Sie den Code, den Sie zum Aktualisieren der Option verwenden, über das Front-End bereitstellen? Wenn es sich um einen Rückruf handelt, posten Sie die gesamte Funktion sowie die Aktion/den Filter, mit dem sie verknüpft ist, bitte .. :)

UPDATE:

Entfernen Sie den Desinfektionsrückruf, bevor Sie die Option aktualisieren.

remove_all_filters( 'sanitize_option_test-option', 10 );

Und Ihre Werte werden von der Rückruffunktion nicht mehr abgeschlachtet, da sie nicht mehr angehakt werden. :)

0
t31os

Könnten Sie stattdessen nicht einfach Ihre Aktion auf init auslösen?

Die Anforderung, Optionen zu aktualisieren, ist immer noch dieselbe (nur Administratoren können manage_options), also sollte es theoretisch funktionieren, haben Sie es versucht, war ihr Problem?

Momentan nicht auf meinem Haupt-PC, sonst würde ich es selbst ausprobieren, um zu sehen, ob es funktioniert.

Was hast du hier gemeint ..

Die Überprüfung schlägt fehl, da das Argument update_option nicht übergeben wird.

Ich hätte in einem Kommentar gefragt, aber ich habe die Rep-Anforderung für dieses Konto noch nicht getroffen.

1
Mark Duncan

Wäre es nicht besser, die relevanten Beiträge zu zählen und dann den Basiswert aus Ihren Optionen zu addieren, um die Gesamtsumme zu erhalten? (Wenn Sie es wirklich brauchen.) Es sei denn, Sie möchten eine vom Frontend aus verfügbare Einstellungsschnittstelle erstellen, scheint dies darauf hinzudeuten, dass Sie dies auf eine andere Weise tun sollten. Ich denke, es könnte für den Benutzer verwirrend sein, wenn sich seine "Einstellungen" von selbst ändern.

0
wyrfel