¿Cómo agregar un campo para la nueva opción de todo el sitio en la pantalla Configuración de red?

15

Estoy trabajando en un complemento, y parte de él implica establecer un valor de opción que se aplique a todos los sitios en una red de WordPress. Sé acerca de las funciones add_site_option y get_site_option que le permiten guardar el valor en la tabla wp_sitemeta, pero lo que no puedo entender es cómo colocar los campos en el lugar apropiado en el backend de WordPress y cómo interceptar el guardado de todo el sitio valores para insertar la llamada add_site_option cuando eso suceda.

Para el primer problema (agregar los campos), normalmente usaría la API de configuración, específicamente register_setting y add_settings_field, para incluir en la lista blanca la nueva opción y luego insertar un campo en la página de opciones correspondiente. Pero no puedo encontrar información en ninguna parte sobre si puede usar add_settings_field para agregar un campo a la página Configuración en la nueva sección Administrador de red del back-end, si hay una función alternativa que hace lo que hace para las páginas de Administrador de red, o si solo hay que inyectar el HTML manualmente. (Puede hacerlo manualmente escribiendo una función que repita el campo y luego conectando esa función a la acción "wpmu_options", que se ejecuta al final de la página de Configuración en Network Admin. Pero luego también tiene que lidiar con nonces y todo lo demás de forma manual.)

El segundo problema probablemente implica encontrar una acción que se ejecuta cuando el usuario presiona "Guardar" en la página de Configuración de administración de red, pero aún no he podido encontrarla. Cualquier pista será muy apreciada.

Entonces, ¿pensamientos? ¿Existe una manera elegante de permitir la administración de opciones en todo el sitio para un complemento a través del nuevo área de administración de red? Si es así, ¿cómo se hace?

jalefkowit
fuente

Respuestas:

11

Hay una wpmu_optionsacción que le permite agregar más HTML en la página Configuración de red.

Si desea agregar su propio submenú / página al menú principal Configuración:

add_action('network_admin_menu', 'add_my_netw_settings_page');
function add_my_netw_settings_page() {
  add_submenu_page(
       'settings.php',
       'Co za asy',
       'Co za asy',
       'manage_network_options',
       'my-netw-settings',
       'your_form'
  );    
}

function your_form(){
  $options = get_site_option('your_plugin');

  ?>
  <form action="<?php echo admin_url('admin-post.php?action=update_my_settings'); ?>" method="post">
    <?php wp_nonce_field('your_plugin_nonce'); ?>

    ...fields go here...

  </form>
  <?php
}

el controlador de guardado:

add_action('admin_post_update_my_settings',  'update_my_settings');
function update_my_settings(){     
  check_admin_referer('your_plugin_nonce');
  if(!current_user_can('manage_network_options')) wp_die('FU');

  // process your fields from $_POST here and update_site_option

  wp_redirect(admin_url('network/settings.php?page=my-netw-settings'));
  exit;  
}

Mantenga el controlador de guardado si elige usar la acción que mencioné anteriormente, y conecte el formulario a esa acción.

Pony de un solo truco
fuente
1
Aquí hay un artículo que describe básicamente el mismo enfoque: xplus3.net/2011/07/13/wordpress-network-admin-pages
mltsy
1

Básicamente, si no desea crear su propia página de configuración de administración de red, deberá usar los dos enlaces mencionados por separado en las otras dos respuestas:

add_filter( 'wpmu_options' , 'show_network_settings' );
add_action( 'update_wpmu_options', 'save_network_settings' );

function save_network_settings() {
  // checkbox example
  if( isset( $_POST['my_network_checkbox'] ) )
    update_site_option( 'my_network_checkbox', '1' );

  // textfield example
  if( isset( $_POST['my_network_textfield'] ) )
    update_site_option( 'my_network_textfield', sanitize_text_field($_POST['my_network_textfield']) );
}

function show_network_settings() {
    $checkbox = get_site_option('my_checkbox'); 
    $text = get_site_option('my_text'); 
    ?>
    <h3><?php _e('My Network Settings','my-plugin'); ?></h3>
    <table class="form-table">
        <tbody>
            <tr>
                <th scope="row"><?php _e('My Checkbox','my-plugin'); ?></th>
                <td>
                    <label>
                        <input type='checkbox' name='my_checkbox' value='1' <?php checked( $checkbox, '1' ); ?> /> 
                    <?php _e('Check my box.','my-plugin'); ?>
                    </label>
                </td>
            </tr>
            <tr>
                <th scope="row"><label for="my_text"><?php _e('My Text','my-plugin'); ?></label></th>
                <td>
                        <input type='text' name='my_text' value='<?php echo $text; ?>' />
                </td>
            </tr>
        </tbody>
    </table>
    <?php
}

Para obtener una explicación muy clara y una muestra de código útil, consulte http://zao.is/2013/07/adding-settings-to-network-settings-for-wordpress-multisite/

RavanH
fuente
0

Me temo que el único método que conozco es el método que mencionó de inyectar manualmente el html y manejar las actualizaciones de las opciones usted mismo. La acción que necesita usar para guardar sus opciones es update_wpmu_options. Si es necesario, puedo proporcionar un ejemplo más detallado, solo avíseme.

BjornW
fuente