Come aggiungere una classe al pulsante di invio dei commenti?
A partire dalla versione 4.1 di WordPress (trac ticket #20446) è stato aggiunto il supporto per passare la propria classe come argomento di comment_form($args)
utilizzando la chiave dell'array 'class_submit'
:
$args = array( 'class_submit' => 'btn btn-default' );
Non è necessario fare ulteriori lavori manuali. (Ho anche modificato il Codex) :)

Sto lavorando con il framework Foundation. Ho scoperto che il modo più semplice per aggiungere una classe a un elemento non filtrabile è farlo con jQuery.
jQuery(document).ready(function($) { //wrapper noconflict
$('input#submit').addClass('button');
});//fine noconflict

Non ci avevo mai pensato. È un po' un hack, ma più pulito che modificare il core. Copio subito il tuo codice!

Ho già un sito che utilizza molto jQuery. Quindi aggiungere questo blocco di codice è stato davvero semplice e ha funzionato perfettamente.

Se dai un'occhiata al sorgente della funzione comment_form()
, vedrai che non stampa nemmeno una classe sull'input:
<input name="submit" type="submit" id="<?php echo esc_attr( $args['id_submit'] ); ?>" value="<?php echo esc_attr( $args['label_submit'] ); ?>" />
Immagino tu abbia bisogno di aggiungere una classe per lo stile? Perché non modificare il tuo CSS semplicemente con:
input.submit, #buttonPro {
/* uno stile fantastico */
}
Altrimenti credo che la soluzione più "semplice" sarebbe copiare la funzione nel tuo functions.php
, rinominarla, aggiungere un argomento per la classe e stamparla, e usare quella invece - che puoi trovare qui ;)

Grazie per il consiglio e il modulo dei commenti. :) Ho un'opzione del tema che aiuta a stilizzare il tema in base a un'interfaccia chiara o scura. Se ci fosse una semplice funzione che potesse aggiungere una classe, potrei racchiuderla in un'istruzione if:isdark. Dovrò guardare più da vicino la funzione longform che hai fornito.

Nel mio Tema Oenology, genero CSS personalizzato in base a se lo schema di colore corrente è scuro o chiaro. Ecco il \functions\options.php
file che fa tutto il lavoro pesante.

Perché hai bisogno di una classe sul pulsante di invio? Puoi assegnargli un ID, come hai scoperto, e questo è tutto ciò che ti serve per stilizzarlo.
comment_form(array('id_submit'=>'buttonPro'));
Poi per stilizzarlo:
input#buttonPro {...}
Semplice. Oppure, se preferisci usare solo le classi per qualche motivo:
.form-submit input {...}
Non vedo alcun vantaggio, da nessun punto di vista, nell'aggiungere una classe al pulsante di invio del modulo dei commenti.

Assolutamente. Se hai bisogno di maggiore specificità, indirizza i tuoi selettori CSS più in alto nell'albero. Guarda l'ID o la classe del contenitore che ospita il modulo di risposta al commento, o che contiene l'intero markup dei commenti. Inoltre, dovrebbe esserci un solo modulo di risposta ai commenti in una determinata pagina, quindi non vedo il problema nel puntare all'ID del pulsante di invio, passato tramite argomento, per applicare il CSS.

Con tutto il rispetto, sono in disaccordo. Ho un sito web+blog. Ho definito una classe e l'ho utilizzata per tutti i pulsanti. Inoltre ho diversi stati per i pulsanti (normale, hover). Se non applicassi una classe al pulsante del commento, significherebbe che dovrei puntare al pulsante del commento del blog tramite ID e iniziare ad aggiungere il selettore accanto alla classe già definita (separato da virgola). Ciò significa che non posso sfruttare la classe già definita e questo non è preferibile. Applicare semplicemente il nome della classe al pulsante rende la vita molto più semplice senza dover aggiungere manualmente l'ID e mantiene tutto semplice.

Devner: Stai usando il CSS esattamente al contrario di come è pensato per essere utilizzato. I nomi delle classi e gli ID dovrebbero essere definiti semanticamente, non in base a come vuoi che siano stilizzati. Il punto è poter modificare il CSS invece di cambiare l'HTML, perché l'HTML è spesso generato, mentre il CSS è molto più facile da modificare.

Alcuni framework come Bootstrap forniscono stili per i pulsanti attraverso classi, ad esempio .btn - sebbene non sia un grosso problema, sarebbe più semplice se potesse essere aggiunta una classe.

So che è passato diverso tempo, ma sono sorpreso da questa affermazione: "Non vedo alcun vantaggio, da nessun punto di vista, nell'aggiungere una classe al pulsante di invio del modulo di commento." Perché aggiungere un ID aggiuntivo al foglio di stile quando una classe esistente (ad esempio per lo stile dei pulsanti) può fornire lo stile necessario?

Chris: Perché l'HTML dovrebbe essere semantico. I fogli di stile dovrebbero essere modificati per cambiare l'"aspetto" delle cose, mentre l'HTML dovrebbe descrivere il contenuto. Modificare l'HTML per ottenere un cambiamento nell'"aspetto" è esattamente ciò che i fogli di stile sono stati creati per evitare in primo luogo.

Otto, sinceramente non riesco a capire come il tuo punto di vista dopo tutti questi anni sembri essere ancora lo stesso. Che mi dici di Bootstrap, Foundation e altri framework? Usano tutti o il tag <button>
o una classe "button". Ci sono numerose patch che semplicemente aggiungono una classe, qual è il problema? Perché questa questione sembra essere ostacolata da poche persone (testarde), rovinando chiaramente l'esperienza per tutti gli altri? Che senso ha che io debba copiare l'intero file che @TheDeadMedic è stato così gentile da mettere a disposizione? Invece voi potreste risolvere il problema aggiungendo 2 righe nel core e chiuderla lì! Assurdo!

@Otto Non capisco come io stia tornando indietro. A parte le ragioni che ho specificato sopra, non desidero usare ID da nessuna parte nel mio foglio di stile perché voglio evitare problemi di specificità che potrebbero sorgere usando quelli. Sto cercando semplicemente di riutilizzare le classi che ho già definito senza dover fare nulla di extra. Sì, se aggiungere un attributo classe mi aiuterà a non preoccuparmi dei problemi di specificità e a mantenere il mio codice consistente, opto per loro. Le classi esistono per un motivo e sto parlando a favore di quei motivi. Inoltre non vedo come aggiungere nomi di classe renderà il codice non semantico.

Stavo cercando la stessa soluzione e alla fine ho trovato la risposta, il codice qui sotto ha funzionato perfettamente per me. Volevo aggiungere la classe "btn btn-primary" al pulsante di invio nel modulo dei commenti.
ob_start();
comment_form( $args );
$form = ob_get_clean();
$form = str_replace('class="comment-form"','class="comment-form"', $form);
echo str_replace('id="submit"','class="btn btn-primary"', $form);
Gli argomenti $args che ho utilizzato sono
$args = array(
'comment_field' => '<p class="comment-form-comment"><label for="comment">Commento</label> <textarea class="form-control" id="comment" name="comment" cols="35" rows="12" aria-required="true"></textarea></p>',
'fields' => array(
'author' => '<p class="comment-form-author"><label for="author">Nome <span class="required">*</span></label> <input class="form-control input-comment-author" id="author" name="author" type="text" value="" size="30" aria-required="true"></p>',
'email' => '<p class="comment-form-email"><label for="email">Email <span class="required">*</span></label> <input class="form-control input-comment-email" id="email" name="email" type="text" value="" size="30" aria-required="true"></p>',
'url' => '<p class="comment-form-url"><label for="url">Sito web</label> <input class="form-control input-comment-url" id="url" name="url" type="text" value="" size="30"></p>',
),
'cancel_reply_link' => '<button class="btn btn-danger btn-xs">Annulla risposta</button>',
'label_submit' => 'Invia commento',);

Risponderò (in ritardo) poiché stavo cercando una risposta a questo e ho deciso di affrontarlo da solo.
Innanzitutto, per rispondere alla domanda "perché aggiungere una classe?"... Nel mio caso, ho scelto di utilizzare un framework UI chiamato Foundation per progettare il mio tema più recente per il mio blog personale. L'ho scelto proprio perché mi piace il suo stile per i pulsanti. Tuttavia, richiede allo sviluppatore di aggiungere una classe a un pulsante <input>
, e non mi ero reso conto che questo non poteva essere fatto in WP fino a quando non avevo quasi completato il tema!
Quindi, ecco cosa ho fatto. Ho dovuto modificare il file /wp-includes/comment-template.php
, quindi usatelo a vostro rischio perché potrebbe essere sovrascritto durante un aggiornamento di WP.
Dopo la riga 1540
(nella versione 3.2.1) aggiungete la seguente riga:
'class_submit' => 'submit',
Poi modificate la riga 1576
con quanto segue:
<input name="submit" class="<?php echo esc_attr( $args['class_submit'] ); ?>" type="submit" id="<?php echo esc_attr( $args['id_submit'] ); ?>" value="<?php echo esc_attr( $args['label_submit'] ); ?>" />
Ora avete un nuovo valore predefinito chiamato class_submit
che può essere incluso nell'array parametro $args
della funzione comment_form()
:
<?php comment_form(
array(
'class_submit' => __('XXX'),
)
); ?>
Buon lavoro!

Modificare il core è una pessima idea e su questo sito alcune persone la prendono sul personale. Dato che sei nuovo qui, rimuoverò il voto negativo che qualcuno ti ha lasciato. Ma ora lo sai.

Alex, Taylor ha ragione. NON modificare MAI i file del core! MAI E POI MAI!
