Lösen Sie eine benutzerdefinierte Aktion aus, wenn Sie die Einstelltaste drücken

8

Dies ist mein erstes WordPress-Plugin und ich habe große Probleme damit, dass es funktioniert. Es funktioniert fast einwandfrei, aber ich finde keinen Weg, um dieses spezielle Ziel zu erreichen.

Grundsätzlich habe ich meine benutzerdefinierte Einstellungsseite für mein Plugin, sie speichert alles ohne Probleme, aber die Frage ist, wie kann ich mit meiner anderen Schaltfläche (innerhalb derselben Einstellungsseite) in diesem Fall eine Synchronisierungsaktion auslösen .

Da mein Plugin nach der Konfiguration eine weitere Aktion auslöst, mit der Datensätze in einer Tabelle erstellt / aktualisiert werden, muss ich jedoch zum ersten Mal eine Synchronisierung ausführen, um die Datensätze aus den alten Posts von WordPress zu erstellen / aktualisieren.

Bearbeiten:

Plugin Quellcode auf wsd-parse-api .

norman784
quelle
Können Sie bitte Ihren Code posten?
s_ha_dum
ist nicht wirklich notwendig, weil es jetzt ein bisschen komplex ist (in vielen Dateien getrennt usw.). Aber die toscho Antwort war genau das, was ich will. Grüße
norman784
Github Repo des Plugins hinzugefügt!
norman784
Wow, wie wertlos ist die menschliche Zeit, wenn Leute diese Art von Kauderwelsch ablehnen? Diese Frage macht keinen Sinn.
Jim Maguire

Antworten:

14

Sie benötigen eine Sekunde formmit admin_url('admin-post.php')als Formularaktion. Dann können Sie sich einhängen admin_post_custom_action, um Ihre Aktion auszuführen.

Beispielcode:

add_action( 'admin_post_wpse_79898', 'wpse_79898_test' );

function wpse_79898_test() {
    if ( isset ( $_GET['test'] ) )
        echo esc_html( $_GET['test'] );

    die( __FUNCTION__ );
}

Auf Ihrer Einstellungsseite:

<form action="<?php echo admin_url( 'admin-post.php' ); ?>">
<input type="hidden" name="action" value="wpse_79898">
<input type="text" name="test" value="">
<?php submit_button( 'Send' ); ?>
</form>

Aktualisieren

Hier ist ein ziemlich erweitertes Beispiel. Es zeigt:

  • grundlegende Sicherheitsmaßnahmen (Nonces, Flucht),
  • wie man sich registriert und den Rückruf benutzt,
  • Wie man zur ursprünglichen Seite zurückleitet, funktioniert dies auch für netzwerkaktivierte Plugins.
  • So zeigen Sie eine benutzerdefinierte Nachricht basierend auf einer weißen Liste zulässiger Werte an.

Das hier verwendete Beispiel - Aktualisieren einer Option - sollte nicht für Plugins verwendet werden, die nur vor Ort aktiviert wurden. Für netzwerkaktivierte Plugins ist dies jedoch sehr nützlich, da es für diese keine Options-API gibt.

Ich sollte Kommentare hinzufügen, aber ich bin zu faul. :) Ich werde einen Blog-Beitrag darüber schreiben und die Antwort später mit einem Link aktualisieren.

<?php
/* Plugin Name: admin-post demo */

add_action( 'wp_loaded', array ( WPSE_79898_Admin_Post_Demo::get_instance(), 'register' ) );

class WPSE_79898_Admin_Post_Demo
{
    /**
     * Plugin instance.
     *
     * @see get_instance()
     * @type object
     */
    protected static $instance = NULL;

    protected $action     = 'wpse_79898';
    protected $option_name     = 'wpse_79898';
    protected $page_id = NULL;

    /**
     * Access this plugin’s working instance
     *
     * @wp-hook wp_loaded
     * @return  object of this class
     */
    public static function get_instance()
    {
        NULL === self::$instance and self::$instance = new self;
        return self::$instance;
    }

    public function register()
    {
        add_action( 'admin_menu', array ( $this, 'add_menu' ) );
        add_action( "admin_post_$this->action", array ( $this, 'admin_post' ) );
    }

    public function add_menu()
    {
        $page_id = add_options_page(
            'Admin Post Demo',
            'Admin Post Demo',
            'manage_options',
            'admin-post-demo',
            array ( $this, 'render_options_page' )
        );

        add_action( "load-$page_id", array ( $this, 'parse_message' ) );
    }

    public function parse_message()
    {
        if ( ! isset ( $_GET['msg'] ) )
            return;

        $text = FALSE;

        if ( 'updated' === $_GET['msg'] )
            $this->msg_text = 'Updated!';

        if ( 'deleted' === $_GET['msg'] )
            $this->msg_text = 'Deleted!';

        if ( $this->msg_text )
            add_action( 'admin_notices', array ( $this, 'render_msg' ) );
    }

    public function render_msg()
    {
        echo '<div class="' . esc_attr( $_GET['msg'] ) . '"><p>'
            . $this->msg_text . '</p></div>';
    }

    public function render_options_page()
    {
        $option = esc_attr( stripslashes( get_option( $this->option_name ) ) );
        $redirect = urlencode( remove_query_arg( 'msg', $_SERVER['REQUEST_URI'] ) );
        $redirect = urlencode( $_SERVER['REQUEST_URI'] );

        ?><h1><?php echo $GLOBALS['title']; ?></h1>
        <form action="<?php echo admin_url( 'admin-post.php' ); ?>" method="POST">
            <input type="hidden" name="action" value="<?php echo $this->action; ?>">
            <?php wp_nonce_field( $this->action, $this->option_name . '_nonce', FALSE ); ?>
            <input type="hidden" name="_wp_http_referer" value="<?php echo $redirect; ?>">

            <label for="<?php echo $this->option_name; ?>">Enter some text:</label>
            <input type="text" name="<?php echo $this->option_name;
                ?>" id="<?php echo $this->option_name;
                ?>" value="<?php echo $option; ?>">
            <?php submit_button( 'Send' ); ?>
        </form>
        <?php
    }

    public function admin_post()
    {
        if ( ! wp_verify_nonce( $_POST[ $this->option_name . '_nonce' ], $this->action ) )
            die( 'Invalid nonce.' . var_export( $_POST, true ) );

        if ( isset ( $_POST[ $this->option_name ] ) )
        {
            update_option( $this->option_name, $_POST[ $this->option_name ] );
            $msg = 'updated';
        }
        else
        {
            delete_option( $this->option_name );
            $msg = 'deleted';
        }

        if ( ! isset ( $_POST['_wp_http_referer'] ) )
            die( 'Missing target.' );

        $url = add_query_arg( 'msg', $msg, urldecode( $_POST['_wp_http_referer'] ) );

        wp_safe_redirect( $url );
        exit;
    }
}
Fuxia
quelle
1
es funktioniert jetzt, wie ich es zurück auf die gleiche Einstellungsseite leite und es gibt eine Funktion, um eine Flash-Nachricht anzuzeigen, genau wie die, die nach dem Speichern
angezeigt wird
1
@ norman784 Siehe mein Update.
Fuxia
1
schön, jetzt muss ich mein Plugin neu schreiben! xD und benutze OOP. Danke
norman784