web-dev-qa-db-fra.com

Comment utiliser control_callback lors de la création d'un widget via functions.php ou un plugin?

J'ai créé un widget de tableau de bord dans mon fichier functions.php. Je veux qu'il soit capable de mettre à jour certains éléments de la base de données lors de la soumission du formulaire. Selon la documentation du codex, je devrais gérer mes envois postaux avec le 4ème argument de wp_add_dashboard_widget (), $ control_callback.

J'ai donc créé ma fonction de gestionnaire et l'inclus dans mon fichier functions.php. Lorsque je soumets mon formulaire, rien ne se passe. J'y ai réfléchi une minute, puis j'ai raccordé la fonction de rappel à wp_dashboard_setup avec add_action (); Ma fonction de rappel est maintenant exécutée, mais peu importe si je transmets la fonction control_callback à wp_add_dashboard_widget (), ce qui me donne l'impression que ma solution est un peu bidon.

Est-ce que je fais mal et y a-t-il une meilleure façon de le faire? De plus, mon formulaire est-il censé être soumis à tout moment ou peut-il simplement être renvoyé à l'endroit où il a été dessiné?

Heres mon code complet:

function custom_dashboard_widget_coach() {
        echo "
        <p><strong>Finalize Game</strong></p>
        <form method='post'>
        <div class='team_class_wrap'>
            <label>Class</label>
            <select name='team' id='team'>
                <option value='5a'>5A</option>
                <option value='4a'>4A</option>
                <option value='3a'>3A</option>
                <option value='2a'>2A</option>
            </select>
        </div>          
        <input type='submit' value='Report Game Result' />
        </form>
        ";
    }

    function custom_dashboard_widget_coach_handle()
    {
        var_dump($_POST);exit;

    }

    function add_custom_dashboard_widget_coach() {
        wp_add_dashboard_widget('custom_dashboard_widget_coach', 'My Team', 'custom_dashboard_widget_coach', 'custom_dashboard_widget_coach_handle');
    }
    add_action('wp_dashboard_setup', 'custom_dashboard_widget_coach_handle');
    add_action('wp_dashboard_setup', 'add_custom_dashboard_widget_coach');
3
John B

En fait, seuls les champs de provenance doivent figurer dans la fonction control_callback, à la fois sous forme et sous forme de traitement, essayez ceci:

<?php
/*
Plugin Name: custom dashboard widget
Plugin URI: http://en.bainternet.info
Description: custom dashboard widget with control form
Version: 0.1
Author: bainternet
Author URI: http://en.bainternet.info
*/

//show widget
function custom_dashboard_widget_coach() {
    //get saved data
    if ( !$widget_options = get_option( 'my_dashboard_widget_options' ) )
        $widget_options = array();
    $saved_team = isset($widget_options['team'])? $widget_options['team'] : '';
        echo "
        <p><strong>Finalized Game</strong></p>
        <div class='team_class_wrap'>
            <label>Class {$saved_team}</label>
        </div>
        ";
}

//configure and update widget
function custom_dashboard_widget_coach_handle(){
    //get saved data
    if ( !$widget_options = get_option( 'my_dashboard_widget_options' ) )
        $widget_options = array();

    //process update
    if ( 'POST' == $_SERVER['REQUEST_METHOD'] && isset($_POST['my_dashboard_widget_options']) ) {
        //minor validation
            $widget_options['team'] = wp_kses($_POST['my_dashboard_widget_options']['team'],array() );
        //save update
                update_option( 'my_dashboard_widget_options', $widget_options );
        }

    //set defaults  
    if(!isset($widget_options['team']))
        $widget_options['team'] = ''; //you can set the default
        echo "
        <p><strong>Finalize Game</strong></p>
        <div class='team_class_wrap'>
            <label>Class</label>
            <select name='my_dashboard_widget_options[team]' id='team'>
                <option value='5a' ".selected( $widget_options['team'], '5a', false ).">5A</option>
                <option value='4a' ".selected( $widget_options['team'], '4a', false ).">4A</option>
                <option value='3a' ".selected( $widget_options['team'], '3a', false ).">3A</option>
                <option value='2a' ".selected( $widget_options['team'], '2a', false ).">2A</option>
            </select>
        </div>
        ";
}

//register widget
function add_custom_dashboard_widget_coach() {
        wp_add_dashboard_widget('custom_dashboard_widget_coach', 'My Team', 'custom_dashboard_widget_coach', 'custom_dashboard_widget_coach_handle');
}
add_action('wp_dashboard_setup', 'add_custom_dashboard_widget_coach');

Ce qui vous donnera: enter image description here

Et une fois que vous cliquez sur "Configurer", vous obtenez le formulaire:enter image description here

Et lorsque vous cliquez sur soumettre, les données sont enregistrées et vous verrez ceci:enter image description here

Dans mon exemple, les données sont stockées dans la table d'options sous forme de tableau dans une nouvelle ligne, mais vous pouvez utiliser l'option dashboard_widget_options pour les données spécifiques au widget (paramètres du widget) ou usermeta pour les données propres à l'utilisateur.

5
Bainternet