Wie füge ich ein Feld für eine neue standortweite Option auf dem Bildschirm "Netzwerkeinstellungen" hinzu?

15

Ich arbeite an einem Plugin, und ein Teil davon besteht darin, einen Optionswert festzulegen, der für alle Sites in einem WordPress-Netzwerk gilt. Ich kenne die Optionen add_site_option und get_site_option Funktionen , mit denen Sie den Wert in der Tabelle wp_sitemeta speichern können. Was ich jedoch nicht herausfinden kann, ist, wie die Felder an der richtigen Stelle im WordPress-Backend platziert werden und wie das Speichern der gesamten Site abgefangen wird Werte, um in diesem Fall den Aufruf add_site_option einzufügen.

Für das erste Problem (Hinzufügen der Felder) würde ich normalerweise die Einstellungs-API verwenden, insbesondere register_setting und add_settings_field, um die neue Option auf die Whitelist zu setzen und anschließend ein Feld in die entsprechende Optionsseite einzufügen. Ich kann jedoch nirgendwo Informationen darüber finden, ob Sie mit add_settings_field ein Feld zur Seite "Einstellungen" im neuen Abschnitt "Netzwerkadministration" des Backends hinzufügen können, ob es eine alternative Funktion gibt, die die Netzwerkadministrationsseiten unterstützt, oder ob Sie dies tun Sie müssen nur den HTML-Code manuell einfügen. (Sie können dies manuell tun, indem Sie eine Funktion schreiben, die das Feld wiedergibt, und diese Funktion dann mit der Aktion "wpmu_options" verbinden, die am Ende der Seite "Einstellungen" in Network Admin ausgeführt wird. Dann müssen Sie sich aber auch mit Nonces befassen und alles andere manuell.)

Das zweite Problem besteht wahrscheinlich darin, eine Aktion zu finden, die ausgeführt wird, wenn der Benutzer auf der Seite "Netzwerkadmin-Einstellungen" auf "Speichern" klickt, die ich jedoch noch nicht finden konnte. Irgendwelche Hinweise wären sehr dankbar.

Also - Gedanken? Gibt es eine elegante Möglichkeit, die Verwaltung von Sitewide-Optionen für ein Plugin über den neuen Netzwerkadministrationsbereich zu ermöglichen? Wenn ja, wie geht das?

jalefkowit
quelle

Antworten:

11

Es gibt eine wpmu_optionsAktion, mit der Sie mehr HTML auf der Seite "Netzwerkeinstellungen" anhängen können.

Wenn Sie dem übergeordneten Menü Einstellungen ein eigenes Untermenü / eine eigene Seite hinzufügen möchten:

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
}

der sichere Handler:

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

Behalten Sie den Save-Handler bei, wenn Sie die oben erwähnte Aktion verwenden möchten, und verknüpfen Sie das Formular mit dieser Aktion.

ein Trickpony
quelle
1
Hier ist ein Artikel, der im Grunde den gleichen Ansatz beschreibt: xplus3.net/2011/07/13/wordpress-network-admin-pages
mltsy
1

Wenn Sie keine eigene Seite mit Netzwerkadministratoreinstellungen erstellen möchten, müssen Sie grundsätzlich beide Haken verwenden, die in den beiden anderen Antworten getrennt aufgeführt sind:

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
}

Eine sehr klare Erklärung und ein nützliches Codebeispiel finden Sie unter http://zao.is/2013/07/adding-settings-to-network-settings-for-wordpress-multisite/

RavanH
quelle
0

Ich befürchte, dass die einzige mir bekannte Methode die von Ihnen erwähnte ist, das HTML manuell zu injizieren und die Aktualisierungen der Optionen selbst vorzunehmen. Die Aktion, die Sie zum Speichern Ihrer Optionen verwenden müssen, lautet update_wpmu_options. Bei Bedarf kann ich ein ausführlicheres Beispiel liefern, lassen Sie es mich einfach wissen.

BjornW
quelle