質問

I'm wondering if it is possible to add a specific text-widget($id) or either an entire dynamic_sidebar($id) in to the wordpress' dashboard.

Actually, I just need the client to edit the text of a text-widget on dashboard, without going to the menu "Appearance > Widgets" — this section is hidden for this user role.

If you can leave here some link or code, I'd appreciate it.
Thanks in advance

役に立ちましたか?

解決

To solve this, my research led me to:

The following is just a proof of concept based on the always excellent code of @Bainternet (in the Q about control_callback).

The Dashboard Widget displays the title of a selected Text Widget it displays "Content of..." but should be "Title of..."


Its configuration screen displays a dropdown with all Text Widgets of all Sidebars:


Here's the Appearance > Widgets screen


Now, what's left to implement is an editing interface (text input and so on) and save the proper values inside the option widget_text, using:
update_option('widget_text', $a_VERY_well_structured_array_otherwise_things_will_break);.

<?php
/*
Plugin Name: Dashboard Widget to deal with Text Widgets
Plugin URI: http://stackoverflow.com/q/14898302/1287812
Description: based on Bainternet plugin https://wordpress.stackexchange.com/q/77830/12615
Version: 0.1
Author: brasofilo
Author URI: https://wordpress.stackexchange.com/users/12615/brasofilo
*/

// Register widget
add_action( 'wp_dashboard_setup', 'add_dashboard_widget_wpse_77830' );

function add_dashboard_widget_wpse_77830() 
{
    wp_add_dashboard_widget(
        'dashboard_widget_wpse_77830', 
        'Text Widgets', 
        'dashboard_widget_wpse_77830', 
        'dashboard_widget_wpse_77830_handle'
    );
}

// Show widget
function dashboard_widget_wpse_77830() 
{
    //get saved data
    if ( !$widget_options = get_option( 'my_dashboard_widget_options' ) )
        $widget_options = array();

    $saved_txt_widget = isset( $widget_options['txt_widget'] ) ? $widget_options['txt_widget'] : '';
    echo "
    <p><strong>Content of the Widget</strong></p>
    <div class='txt_widget_class_wrap'>
        <label style='background:#ccc;'>&nbsp; {$saved_txt_widget}</label>
    </div>
    ";
}

// Configure and update widget
function dashboard_widget_wpse_77830_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['txt_widget'] = wp_kses( $_POST['my_dashboard_widget_options']['txt_widget'], array() );
        // Save update
        update_option( 'my_dashboard_widget_options', $widget_options );
    }

    // Set defaults  
    if( !isset( $widget_options['txt_widget'] ) )
        $widget_options['txt_widget'] = ''; //you can set the default

    // Get Widget Text
    $txt = get_option( 'widget_text' );
    // Not necessary in the array
    unset($txt['_multiwidget']);

    // Start HTML
    echo "
    <p><strong>Available Text Widgets</strong></p>
    <div class='txt_widget_class_wrap'>
        <label>Title</label>
        <select name='my_dashboard_widget_options[txt_widget]' id='txt_widget'>";

    // Print options
    foreach( $txt as $t )
    {
        printf(
            '<option value="%s" %s>%s</option>',
            $t['title'],
            selected( $widget_options['txt_widget'], $t['title'], false ),
            $t['title']
            );

    }

    // End HTML
    echo "
           </select>
       </div>
       ";
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top