Déclencher une action personnalisée lorsque le bouton de réglage est enfoncé

8

Ceci est mon premier plugin wordpress et j'ai beaucoup de mal à le faire fonctionner, cela fonctionne presque bien mais je ne trouve pas de moyen d'accomplir cette chose spécifique.

Fondamentalement, j'ai ma page de configuration personnalisée pour mon plugin, il enregistre tout sans aucun problème, mais la question est, comment puis-je utiliser mon autre bouton (à l'intérieur de la même page de configuration) pour déclencher, dans ce cas, une action de synchronisation .

Parce que mon plugin après avoir configuré, il déclenche une autre action qui crée / met à jour des enregistrements sur une table, mais la première fois que je dois exécuter une synchronisation pour créer / mettre à jour les enregistrements à partir des anciens messages de wordpress.

Éditer:

Code source du plugin sur wsd-parse-api .

norman784
la source
Pouvez-vous poster votre code s'il vous plaît?
s_ha_dum
n'est pas vraiment nécessaire, car c'est un peu complexe maintenant (séparé dans de nombreux fichiers, etc.). Mais la réponse toscho était exactement ce que je voulais. Cordialement
norman784
ajout du dépôt github du plugin!
norman784
Wow, à quel point le temps humain est sans valeur quand les gens votent pour ce genre de charabia? Cette question n'a aucun sens.
Jim Maguire

Réponses:

14

Vous avez besoin d'une seconde formavec une admin_url('admin-post.php')action de formulaire. Ensuite, vous pouvez vous connecter admin_post_custom_actionpour exécuter votre action.

Exemple de code:

add_action( 'admin_post_wpse_79898', 'wpse_79898_test' );

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

    die( __FUNCTION__ );
}

Dans votre page de paramètres:

<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>

Mise à jour

Voici un exemple assez étendu. Ça montre:

  • actions de sécurité de base (nonces, échappement),
  • comment s'inscrire et utiliser le rappel,
  • comment rediriger vers la page d'origine, cela fonctionne même pour les plugins activés par le réseau,
  • comment afficher un message personnalisé basé sur une liste blanche de valeurs autorisées.

L'exemple que j'ai utilisé ici - la mise à jour d'une option - ne doit pas être utilisé uniquement pour les plugins activés sur site. Pour les plugins activés en réseau, cela est très utile, car il n'y a pas d'API d'options pour ceux-ci.

Je devrais ajouter des commentaires, mais je suis trop paresseux. :) Je vais écrire un article sur ce sujet et mettre à jour la réponse plus tard avec un lien.

<?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
la source
1
cela fonctionne, maintenant comment je le redirige vers la même page de paramètres et il y a une fonction pour afficher un message flash tout comme celui qui s'affiche après la sauvegarde ...
norman784
1
@ norman784 Voir ma mise à jour.
fuxia
1
sympa, maintenant je dois réécrire mon plugin! xD et utilisez OOP. Merci
norman784