web-dev-qa-db-de.com

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

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 Funktionen add_site_option und get_site_option , mit denen Sie den Wert in der Tabelle wp_sitemeta speichern können, aber ich kann nicht herausfinden, wie die Felder an der richtigen Stelle im WordPress-Backend platziert werden. und wie man das Speichern von standortweiten Werten abfängt, 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 dann ein Feld dafür in die entsprechende Optionsseite einzufügen. Ich kann jedoch nirgendwo Informationen darüber finden, ob Sie add_settings_field verwenden können, um der Seite "Einstellungen" im neuen Abschnitt "Netzwerkadministration" des Backends ein Feld hinzuzufügen, ob es eine alternative Funktion gibt, die die Funktionen für Netzwerkadministrationsseiten ausführt, 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 jedoch 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?

14
jalefkowit

Es gibt eine wpmu_options Aktion, 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.

10
onetrickpony

Grundsätzlich müssen Sie, wenn Sie keine eigene Netzwerkadministrator-Einstellungsseite erstellen möchten, beide Hooks verwenden, die in den beiden anderen Antworten separat 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/

1
RavanH

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.

0
BjornW