web-dev-qa-db-ger.com

Benutzerdefinierte Aktion auslösen, wenn die Einstelltaste gedrückt wird

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

Grundsätzlich habe ich meine eigene Einstellungsseite für mein Plugin, es spart 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 andere Aktion auslöst, die Datensätze für eine Tabelle erstellt/aktualisiert, 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 .

8
norman784

Sie benötigen eine zweite form mit admin_url('admin-post.php') als Formularaktion. Dann können Sie sich in admin_post_custom_action einhängen, 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>

Update

Hier ist ein ziemlich ausführliches 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 auch bei netzwerkaktivierten Plugins.
  • anzeigen einer benutzerdefinierten Nachricht basierend auf einer weißen Liste zulässiger Werte.

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;
    }
}
13
fuxia