2012-04-26 12 views
16

In un'installazione di WordPress multisito sto personalizzazione, ho bisogno di aggiungere un campo di testo semplice per il modulo di iscrizione per la creazione di nuovi siti di blog, che è situato inWordPress + Multisito: come aggiungere opzioni blog personalizzate per aggiungere il modulo Nuovo sito nell'amministratore di rete?

Network Admin > Sites > Add New

Naturalmente ho bisogno di questo campo per ottenere salvato insieme agli altri meta dati da quel modulo, nella tabella {new_blog_prefix}_options.

Sono particolarmente interessato al modo più semplice, più diretto e/o il "modo giusto" (vale a dire il WordPress Way) per realizzare questo, ma mi accontenterò di The Way That Works ™!

Finora ho incontrato numerosi vicoli ciechi nella mia ricerca:

  • Impostazioni API - [WP Codex]

    Per quanto posso dire, delle impostazioni API (a)potrebbe non funzionare per la sezione Amministrazione di rete (anche se questo potrebbe essere cambiato in una versione recente di WP); inoltre, (b) sembra che questo ti consenta di aggiungere/modificare schermate solo nella sezione Settings del Dashboard.

  • wpmu_options gancio - [Hooks DB]

    sembra essere un gancio esclusivamente per l'aggiunta di opzioni alla schermata Impostazioni di rete.

  • add_site_option/add_blog_option - [WP Codex]

    più vicino posso trovare; sembra consentire di aggiungere opzioni specifiche del sito alla tabella {blogsite_prefix}_options, ma ancora non aiuta con l'aggiunta di opzioni al modulo di amministrazione.

Quindi ... nessun dado. Qualsiasi aiuto è apprezzato!

risposta

27

Se si guarda allo source code della pagina "Aggiungi nuovo sito", è possibile vedere che WordPress non fornisce un aggancio per questo scopo. Naturalmente, è possibile aggiungere un gancio da soli, ma generalmente è cattive pratiche per modificare il core di WordPress.

Tuttavia, una volta inviata e tutte le informazioni sono presenti, la pagina chiama la funzione wpmu_create_blog(). In questa funzione è chiamato un gancio, e cioè l'azione wpmu_new_blog:

do_action('wpmu_new_blog', $blog_id, $user_id, $domain, $path, $site_id, $meta); 

A questo punto il blog è già stato creato. Tuttavia, possiamo ancora rilevare se un campo è stato inviato agganciando questa azione e salvandola nel database. Aggiungiamo il seguente nel nostro file plugin (o modello):

function add_new_blog_field($blog_id, $user_id, $domain, $path, $site_id, $meta) { 

    // Make sure the user can perform this action and the request came from the correct page. 

    switch_to_blog($blog_id); 

    // Use a default value here if the field was not submitted. 
    $new_field_value = 'default'; 

    if (!empty($_POST['blog']['new_field'])) 
     $new_field_value = $_POST['blog']['new_field']; 

    // save option into the database 
    update_option('new_field', $new_field_value); 

    restore_current_blog(); 
} 

add_action('wpmu_new_blog', 'add_new_blog_field'); 

Per quanto riguarda la visualizzazione del campo nella pagina, è possibile utilizzare un approccio JavaScript.Aggiungi un file javascript, solo alla pagina "Aggiungi nuovo sito", e su Carica della pagina inserisci il campo nella posizione corretta sulla pagina. Dovresti aggiungere un campo di input con il nome "blog [nuovo campo]". Creiamo il seguente file JavaScript che, una volta caricato, aggiunge un nuovo campo alla pagina 'Aggiungi nuovo sito':

(function($) { 
    $(document).ready(function() { 
     $('<tr class="form-field form-required"></tr>').append(
      $('<th scope="row">New field</th>') 
     ).append(
      $('<td></td>').append(
       $('<input class="regular-text" type="text" title="New Field" name="blog[new_field]">') 
      ).append(
       $('<p>Explanation about your new field</p>') 
      ) 
     ).insertAfter('#wpbody-content table tr:eq(2)'); 
    }); 
})(jQuery); 

Ora l'unica cosa che resta da fare è includere questo file sulla pagina 'Aggiungi nuovo sito' , con l'aggiunta di questo al vostro file plugin:

// Only add the script for the page site-new.php (the page hook). 
add_action("admin_print_scripts-site-new.php", 'my_admin_scripts'); 

function my_admin_scripts() { 
    wp_register_script('yourScript', plugins_url('js/yourScript.js', __FILE__)); 
    wp_enqueue_script('yourScript'); 
} 

ulteriore suggerimento potrebbe essere, a seconda delle esigenze: Aggiungi un campo di inserimento nella pagina delle impostazioni generali utilizzando add_settings_field, in modo tale che un utente può modificare in un secondo momento (e forse solo se è l'impostazione predefinita per questo campo). Un approccio 'non puoi cambiare questo campo più tardi'.

Spero che questo sia l'aiuto necessario.

+1

Grazie, questa è davvero una bella risposta! Degno di +100 :) –

+0

Molto bello, ma una piccola modifica: 'if (! Empty ($ _ POST ['blog'] ['new_field'])) $ new_field_value = $ _POST ['blog'] ['new_field ']; 'per' if (! isset ($ _ POST [' blog '] [' new_field '])) restituisce FALSE; '... Considera il valore vuoto di new_field, che può essere accettato come valore corretto – Mariyo

+1

Dal momento che WP 4.5, un hook di azione è presente all'interno del tag form di site-new.php chiamato "network_site_new_form". – Berend

Problemi correlati