Activa una acción personalizada al presionar el botón de configuración

8

Este es mi primer plugin de WordPress y estoy teniendo muchos problemas para que funcione, casi funciona bien, pero no encuentro la manera de lograr esto.

Básicamente tengo mi página de configuración personalizada para mi complemento, lo guarda todo sin ningún problema, pero la pregunta es, ¿cómo puedo hacer que mi otro botón (dentro de la misma página de configuración) active, en este caso, una acción de sincronización .

Debido a que mi complemento después de configurado, desencadena otra acción que crea / actualiza registros en una tabla, pero la primera vez que necesito ejecutar una sincronización para crear / actualizar los registros de las publicaciones antiguas de WordPress.

Editar:

Código fuente del complemento en wsd-parse-api .

norman784
fuente
¿Puedes publicar tu código por favor?
s_ha_dum
no es realmente necesario, porque ahora es un poco complejo (separado en muchos archivos, etc.). Pero la respuesta de toscho fue exactamente lo que quiero. Saludos
norman784
¡Agregado repositorio github del complemento!
norman784
Wow, ¿qué valor tiene el tiempo humano cuando la gente vota este tipo de galimatías? Esta pregunta no tiene sentido.
Jim Maguire

Respuestas:

14

Necesita un segundo formcon una admin_url('admin-post.php')forma de acción. Entonces puedes conectarte admin_post_custom_actionpara ejecutar tu acción.

Código de muestra:

add_action( 'admin_post_wpse_79898', 'wpse_79898_test' );

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

    die( __FUNCTION__ );
}

En su página de configuración:

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

Actualizar

Aquí hay un ejemplo bastante extendido. Muestra:

  • acciones básicas de seguridad (nonces, escapar),
  • cómo registrarse y usar la devolución de llamada,
  • cómo redirigir de nuevo a la página original, esto funciona incluso para complementos activados por la red,
  • cómo mostrar un mensaje personalizado basado en una lista blanca de valores permitidos.

El ejemplo que he usado aquí (actualizar una opción) no debe usarse para complementos activados solo en el sitio. Para los complementos activados por la red, aunque esto es bastante útil, porque no hay opciones de API para esos.

Debería agregar comentarios, pero soy demasiado vago. :) Escribiré una publicación de blog sobre esto, y actualizaré la respuesta más tarde con un enlace.

<?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
fuente
1
funciona, ahora ¿cómo vuelvo a dirigir de nuevo a la misma página de configuración y hay una función para mostrar un mensaje flash al igual que el que se muestra después de guardar ...
norman784
1
@ norman784 Vea mi actualización.
fuxia
1
bueno, ¡ahora necesito reescribir mi plugin! xD y usa OOP. Gracias
norman784