Declanșează o acțiune personalizată când se apasă butonul de setări
Acesta este primul meu plugin WordPress și întâmpin multe probleme în a-l face să funcționeze, funcționează aproape bine dar nu găsesc o modalitate de a realiza acest lucru specific.
În principiu, am pagina mea personalizată de setări pentru plugin, salvează totul fără probleme, dar întrebarea este cum pot face ca celălalt buton (din aceeași pagină de setări) să declanșeze, în acest caz, o acțiune de sincronizare.
Deoarece plugin-ul meu, după ce este configurat, declanșează o altă acțiune care creează/actualizează înregistrări într-un tabel, dar prima dată trebuie să rulez o sincronizare pentru a crea/actualiza înregistrările din postările vechi ale WordPress-ului.
Editare:
Codul sursă al plugin-ului pe wsd-parse-api.

Ai nevoie de un al doilea form
cu admin_url('admin-post.php')
ca acțiune a formularului. Apoi poți folosi hook-ul admin_post_custom_action
pentru a executa acțiunea ta.
Cod exemplu:
add_action( 'admin_post_wpse_79898', 'wpse_79898_test' );
function wpse_79898_test() {
if ( isset ( $_GET['test'] ) )
echo esc_html( $_GET['test'] );
die( __FUNCTION__ );
}
În pagina de setări:
<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( 'Trimite' ); ?>
</form>
Actualizare
Iată un exemplu mai extins. Acesta arată:
- acțiuni de bază de securitate (nonces, escaping),
- cum să înregistrezi și să folosești callback-ul,
- cum să redirecționezi înapoi la pagina originală, funcționează chiar și pentru plugin-uri activate la nivel de rețea,
- cum să afișezi un mesaj personalizat bazat pe o listă albă de valori permise.
Exemplul folosit aici – actualizarea unei opțiuni – nu ar trebui utilizat pentru plugin-uri activate doar pe un singur site. Pentru plugin-urile activate la nivel de rețea, acest lucru este destul de util, deoarece nu există o API de opțiuni pentru acestea.
Ar trebui să adaug comentarii, dar sunt prea leneș. :) Voi scrie un articol pe blog despre asta și voi actualiza răspunsul mai târziu cu un link.
<?php
/* Plugin Name: demo admin-post */
add_action( 'wp_loaded', array ( WPSE_79898_Admin_Post_Demo::get_instance(), 'register' ) );
class WPSE_79898_Admin_Post_Demo
{
/**
* Instanța pluginului.
*
* @see get_instance()
* @type object
*/
protected static $instance = NULL;
protected $action = 'wpse_79898';
protected $option_name = 'wpse_79898';
protected $page_id = NULL;
/**
* Accesează instanța de lucru a acestui plugin
*
* @wp-hook wp_loaded
* @return object al acestei clase
*/
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(
'Demo Admin Post',
'Demo Admin Post',
'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 = 'Actualizat!';
if ( 'deleted' === $_GET['msg'] )
$this->msg_text = 'Șters!';
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; ?>">Introduceți un text:</label>
<input type="text" name="<?php echo $this->option_name;
?>" id="<?php echo $this->option_name;
?>" value="<?php echo $option; ?>">
<?php submit_button( 'Trimite' ); ?>
</form>
<?php
}
public function admin_post()
{
if ( ! wp_verify_nonce( $_POST[ $this->option_name . '_nonce' ], $this->action ) )
die( 'Nonce invalid.' . 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( 'Lipsește ținta.' );
$url = add_query_arg( 'msg', $msg, urldecode( $_POST['_wp_http_referer'] ) );
wp_safe_redirect( $url );
exit;
}
}

super, acum trebuie să rescriu pluginul meu! xD și să folosesc OOP. Mulțumesc

add_action
ar trebui să primească o funcție care implicit acceptă un argument. Funcția ta nu acceptă niciun argument. WordPress trimite vreun argument funcției tale pe care îl ignori? Ce argument trimite?

@LimitedAtonementNu există nicio astfel de cerință în ceea ce privește argumentele.
