Como adicionar campo para a nova opção em todo o site na tela Configurações de rede?

15

Estou trabalhando em um plug-in, e parte dele envolve a definição de um valor de opção que se aplica a todos os sites em uma rede WordPress. Eu sei sobre os add_site_option e get_site_option funções que permitem salvar o valor na tabela de wp_sitemeta, mas o que eu não consigo entender é como colocar os campos no local apropriado no backend WordPress, e como interceptar a salvação de todo o site valores para inserir a chamada add_site_option quando isso acontecer.

Para o primeiro problema (adicionando os campos), normalmente eu usaria a API de configurações, especificamente register_setting e add_settings_field, para colocar a nova opção na lista de permissões e, em seguida, insira um campo na página de opções apropriada. Mas não consigo encontrar informações em nenhum lugar sobre se você pode usar add_settings_field para adicionar um campo à página Configurações na nova seção Administrador de Rede do back-end, se houver uma função alternativa que faça o que faz nas páginas de Administrador de Rede ou se você só tem que injetar o HTML manualmente. (Você pode fazer isso manualmente escrevendo uma função que ecoa o campo e, em seguida, conectando-a à ação "wpmu_options", que é executada no final da página Configurações no Network Admin. Mas você também precisa lidar com nonces e tudo o mais manualmente.)

O segundo problema provavelmente envolve encontrar uma ação que seja executada quando o usuário clicar em "Salvar" na página Configurações de administrador de rede, mas ainda não consegui encontrá-la. Alguma pista seria muito apreciada.

Então - pensamentos? Existe uma maneira elegante de permitir o gerenciamento de opções em todo o site para um plug-in através da nova área de Administrador de Rede? Se sim, como é feito?

jalefkowit
fonte

Respostas:

11

Há uma wpmu_optionsação que permite anexar mais HTML na página Configurações de rede.

Se você deseja adicionar seu próprio submenu / página ao menu pai Configurações:

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
}

o manipulador de salvamento:

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;  
}

Mantenha o manipulador de salvamento se você optar por usar a ação mencionada acima e conecte o formulário a essa ação.

onetrickpony
fonte
1
Aqui está um artigo descrevendo basicamente a mesma abordagem: xplus3.net/2011/07/13/wordpress-network-admin-pages
mltsy
1

Basicamente, se você não deseja criar sua própria página de configurações de administrador de rede, precisará usar os dois ganchos mencionados separadamente nas outras duas respostas:

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 obter uma explicação muito clara e um exemplo de código útil, consulte http://zao.is/2013/07/adding-settings-to-network-settings-for-wordpress-multisite/

RavanH
fonte
0

Receio que o único método que conheço seja o método que você mencionou para injetar manualmente o html e lidar com as atualizações das opções. A ação que você precisa usar para salvar suas opções é update_wpmu_options. Se necessário, posso fornecer um exemplo mais detalhado, deixe-me saber.

BjornW
fonte