2011-12-21 11 views
20

Necesito crear un plugin de WordPress que llame a una función de PHP cuando se hace clic en un botón en un panel de administración. He estado buscando tutoriales para escribir complementos básicos de WordPress y agregar paneles de administración, pero todavía no entiendo exactamente cómo registrar un botón para una función específica en mi complemento.Plugin de WordPress: Función de llamada en el botón clic en el panel de administración

Esto es lo que tengo hasta ahora:

/* 
Plugin Name: 
Plugin URI: 
Description: 
Author: 
Version: 1.0 
Author URI: 
*/ 


add_action('admin_menu', 'wc_plugin_menu'); 

function wc_plugin_menu(){ 
add_management_page('Title', 'MenuTitle', 'manage_options', 'wc-admin-menu', 'wc_plugin_options'); 

} 

function wc_plugin_options(){ 
if (!current_user_can('manage_options')) { 
    wp_die(__('You do not have sufficient permissions to access this page.') ); 
} 
echo '<div class="wrap">'; 
echo '<button>Call Function!</button>'; //add some type of hook to call function 
echo '</div>'; 

} 

function button_function() 
{ 
//do some stuff 
} 


?> 

Respuesta

21

Bueno, usted tiene dos opciones.

1) Use AJAX para crear un gancho admin-ajax que ejecute con JavaScript cuando el usuario haga clic en el botón. Puede obtener más información acerca de este enfoque aquí: http://codex.wordpress.org/AJAX (asegúrese de agregar un código de seguridad (http://codex.wordpress.org/WordPress_Nonces)). Este es también un buen recurso para crear ganchos admin-ajax: http://codex.wordpress.org/AJAX_in_Plugins

2) Coloque el botón en un formulario, ENVÍE ese formulario a su complemento y agregue un código para manejar el formulario POST (si lo hace, asegúrese de incluir un nonce para la seguridad (http://codex.wordpress.org/WordPress_Nonces) y también asegurarse de que el usuario que intenta hacer clic en el botón tiene los privilegios adecuados para hacerlo http://codex.wordpress.org/Function_Reference/current_user_can

lo que estamos tratando de hacer no es super-complejo, pero implica una buena comprensión de los formularios, PHP y (tal vez) JavaScript. Si su JavaScript está bien, recomiendo la opción 1, ya que no requiere que el usuario vuelva a cargar la página.

+1

Exactamente lo que necesitaba. Tengo una buena comprensión de php, js, ajax, etc. Solo soy nuevo en wp – NSjonas

+1

@brandwaffle, me cuesta entender cómo adjuntar la función a un botón. ¿Me puede apuntar en la dirección correcta? –

+1

¿Algún código de ejemplo? ¿Cómo debería verse el atributo 'action' de' form'? ¿Cómo debería verse el código de back-end? – Fred

14

Alth Aunque las respuestas en esta página proporcionaron un comienzo útil, me tomó un tiempo encontrar la manera de hacer funcionar la opción (2). Dado esto, el siguiente código podría ser útil para algunas personas.

Si crea un complemento con el siguiente código y agregará una opción de menú a mano izquierda llamada 'Botón de prueba' cuando se encuentre en el área de administración. Haga clic en esto y verá un botón. Al hacer clic en ese botón, se ejecuta la función test_button_action. En mi función de ejemplo, ambos he puesto un mensaje en la página y lo he escrito en un archivo de registro.

<?php 

/* 
Plugin Name: Example of Button on Admin Page 
Plugin URI: 
Description: 
Author: 
Version: 1.0 
Author URI: 
*/ 


add_action('admin_menu', 'test_button_menu'); 

function test_button_menu(){ 
    add_menu_page('Test Button Page', 'Test Button', 'manage_options', 'test-button-slug', 'test_button_admin_page'); 

} 

function test_button_admin_page() { 

    // This function creates the output for the admin page. 
    // It also checks the value of the $_POST variable to see whether 
    // there has been a form submission. 

    // The check_admin_referer is a WordPress function that does some security 
    // checking and is recommended good practice. 

    // General check for user permissions. 
    if (!current_user_can('manage_options')) { 
    wp_die(__('You do not have sufficient pilchards to access this page.') ); 
    } 

    // Start building the page 

    echo '<div class="wrap">'; 

    echo '<h2>Test Button Demo</h2>'; 

    // Check whether the button has been pressed AND also check the nonce 
    if (isset($_POST['test_button']) && check_admin_referer('test_button_clicked')) { 
    // the button has been pressed AND we've passed the security check 
    test_button_action(); 
    } 

    echo '<form action="options-general.php?page=test-button-slug" method="post">'; 

    // this is a WordPress security feature - see: https://codex.wordpress.org/WordPress_Nonces 
    wp_nonce_field('test_button_clicked'); 
    echo '<input type="hidden" value="true" name="test_button" />'; 
    submit_button('Call Function'); 
    echo '</form>'; 

    echo '</div>'; 

} 

function test_button_action() 
{ 
    echo '<div id="message" class="updated fade"><p>' 
    .'The "Call Function" button was clicked.' . '</p></div>'; 

    $path = WP_TEMP_DIR . '/test-button-log.txt'; 

    $handle = fopen($path,"w"); 

    if ($handle == false) { 
    echo '<p>Could not write the log file to the temporary directory: ' . $path . '</p>'; 
    } 
    else { 
    echo '<p>Log of button click written to: ' . $path . '</p>'; 

    fwrite ($handle , "Call Function button clicked on: " . date("D j M Y H:i:s", time())); 
    fclose ($handle); 
    } 
} 
?> 
+1

Si 'WP_TEMP_DIR' undefined,' WP_CONTENT_DIR' funciona. – MikeiLL

Cuestiones relacionadas