Come visualizzare comment_form con uno shortcode rimuovendolo dalla posizione predefinita
Sono già riuscito a far apparire il form dei commenti nell'area del contenuto del post con questo codice, che mi permette di usare lo shortcode [wpsites_comment_form]:
add_shortcode( 'wpsites_comment_form', 'wpsites_comment_form_shortcode' );
function wpsites_comment_form_shortcode() {
// Avvia l'output buffering
ob_start();
// Mostra il form dei commenti
comment_form();
// Ottieni il contenuto del buffer
$cform = ob_get_contents();
// Pulisci e termina l'output buffering
ob_end_clean();
return $cform;
}
Quello che mi serve è rimuovere il form dei commenti dalla parte inferiore del post (visualizzazione predefinita). Quando lo rimuovo dal pannello di amministrazione in Post - Modifica - Commenti - Non consentire, viene rimosso anche dalla posizione dove viene visualizzato tramite la funzione dello shortcode. Quindi come posso fare per visualizzarlo solo dove è posizionato lo shortcode?

Versione #1
Il seguente codice sembra funzionare per il tema Twenty Fifteen:
/**
* Mostra il modulo dei commenti tramite shortcode sulle pagine singole
* Rimuove il modulo dei commenti predefinito.
* Nasconde il messaggio indesiderato "I commenti sono chiusi" con CSS.
*
* @see http://wordpress.stackexchange.com/a/177289/26350
*/
add_shortcode( 'wpse_comment_form', function( $atts = array(), $content = '' )
{
if( is_singular() && post_type_supports( get_post_type(), 'comments' ) )
{
ob_start();
comment_form();
print( '<style>.no-comments { display: none; }</style>' );
add_filter( 'comments_open', '__return_false' );
return ob_get_clean();
}
return '';
}, 10, 2 );
dove consentiamo allo shortcode di visualizzare il modulo dei commenti solo sui post singoli che supportano i commenti.
Qui utilizziamo CSS per nascondere il messaggio indesiderato I commenti sono chiusi.
Versione #2
Ecco un altro approccio senza CSS:
/**
* Mostra il modulo dei commenti tramite shortcode sulle pagine singole.
* Rimuove il modulo dei commenti predefinito.
* Nasconde il messaggio indesiderato "I commenti sono chiusi" tramite filtri.
*
* @see http://wordpress.stackexchange.com/a/177289/26350
*/
add_shortcode( 'wpse_comment_form', function( $atts = array(), $content = '' )
{
if( is_singular() && post_type_supports( get_post_type(), 'comments' ) )
{
ob_start();
comment_form();
add_filter( 'comment_form_defaults', 'wpse_comment_form_defaults' );
return ob_get_clean();
}
return '';
}, 10, 2 );
function wpse_comment_form_defaults( $defaults )
{
add_filter( 'comments_open', 'wpse_comments_open' );
remove_filter( current_filter(), __FUNCTION__ );
return $defaults;
}
function wpse_comments_open( $open )
{
remove_filter( current_filter(), __FUNCTION__ );
return false;
}

La versione #1 è stata testata e funziona con il tema che sto utilizzando. Fantastico!

Se volessi visualizzare anche la lista dei commenti (comments_template) sopra il modulo, avrei bisogno di un'altra funzione shortcode per questo? È un approccio simile?

Ho trovato qualcosa qui, ma non sono sicuro di sapere come applicarlo: http://lists.automattic.com/pipermail/wp-hackers/2011-April/038832.html

Ho provato a imitare la "Versione #1" di birgire condivisa sopra nella risposta per visualizzare l'elenco dei commenti sopra il comment_form. Ha funzionato parzialmente. Visualizza i commenti anche nella posizione predefinita (in fondo).
Ho usato questo:
add_shortcode( 'wpse_comments_template', function( $atts = array(), $content = '' )
{
if( is_singular() && post_type_supports( get_post_type(), 'comments' ) )
{
ob_start();
comments_template();
return ob_get_clean();
}
return '';
}, 10, 2 );

Ho ripubblicato questa seconda domanda oltre questi commenti e forse ho trovato una soluzione, anche se potrebbe non essere il modo migliore. Qui: http://stackoverflow.com/questions/28593898/how-to-display-the-comments-template-with-a-shortcode-in-wordpress/28594128

ok perfetto, non ho avuto tempo di verificarlo, cercherò di darci un'occhiata domani @rodrigonomada

Sono riuscito ad ottenere il risultato che mi serviva ma in parte eliminando dal mio child-theme le parti che non riuscivo a rimuovere tramite codice. Ho rimosso la chiamata comments_template() da single.php e ho rimosso la chiamata comments_form() da comments.php (altrimenti sarebbe apparso dove uso lo shortcode per visualizzare l'elenco dei commenti) Mi chiedo se ci siano aspetti negativi nel fare così piuttosto che filtrarli tramite il file functions.php? @birgire
