Cómo mostrar el comment_form con un shortcode eliminándolo de su posición predeterminada
Ya logré hacer que el formulario de comentarios aparezca en el área de contenido de la publicación con este código, que me permite usar el shortcode [wpsites_comment_form]:
// Agregar shortcode para el formulario de comentarios
add_shortcode( 'wpsites_comment_form', 'wpsites_comment_form_shortcode' );
function wpsites_comment_form_shortcode() {
// Iniciar buffer de salida
ob_start();
// Mostrar formulario de comentarios
comment_form();
// Obtener contenido del buffer
$cform = ob_get_contents();
// Limpiar buffer
ob_end_clean();
// Devolver formulario
return $cform;
}
Lo que necesito es eliminar el formulario de comentarios de la parte inferior de la publicación (ubicación predeterminada). Cuando lo elimino a través del panel de administración en Publicaciones - Editar - Comentarios - No permitir, también se elimina de la ubicación donde se muestra a través de la función del shortcode. ¿Cómo puedo hacer que solo se muestre donde se coloca el shortcode?

Versión #1
Lo siguiente parece funcionar para el tema Twenty Fifteen:
/**
* Mostrar el formulario de comentarios mediante shortcode en páginas individuales
* Eliminar el formulario de comentarios predeterminado.
* Ocultar el mensaje no deseado "Los comentarios están cerrados" 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 );
donde solo permitimos que el shortcode muestre el formulario de comentarios en publicaciones individuales que admitan comentarios.
Aquí usamos CSS para ocultar el mensaje no deseado Los comentarios están cerrados.
Versión #2
Aquí hay otro enfoque sin CSS:
/**
* Mostrar el formulario de comentarios mediante shortcode en páginas individuales.
* Eliminar el formulario de comentarios predeterminado.
* Ocultar el mensaje no deseado "Los comentarios están cerrados" mediante filtros.
*
* @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;
}

¡Versión #1 probada y funciona con el tema que estoy usando. ¡Genial!

Si quiero mostrar también la lista de comentarios (comments_template) para que aparezca encima del formulario, ¿necesitaría otra función de shortcode para ello? ¿Es un enfoque similar?

Encontré algo aquí, pero no estoy seguro de saber cómo aplicarlo: http://lists.automattic.com/pipermail/wp-hackers/2011-April/038832.html

Intenté imitar la "Versión #1" de birgire compartida arriba en la respuesta para mostrar la lista de comentarios sobre el comment_form. Funcionó parcialmente. También muestra los comentarios en la ubicación predeterminada (abajo).
Usé esto:
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 );

Volví a publicar esta segunda pregunta más allá de estos comentarios y tal vez he llegado a una solución, aunque puede que no sea la mejor manera. Aquí: http://stackoverflow.com/questions/28593898/how-to-display-the-comments-template-with-a-shortcode-in-wordpress/28594128

ok genial, no tuve tiempo de revisarlo, intentaré echar un vistazo mañana @rodrigonomada

Logré llegar al resultado que necesitaba pero en parte eliminando en mi child-theme las partes que no podía quitar mediante código. Eliminé la llamada comments_template() de single.php y quité la llamada comments_form() de comments.php (de lo contrario se mostraría donde uso el shortcode para mostrar la lista de Comentarios) Me pregunto si hay aspectos negativos de hacerlo de esta manera en lugar de filtrarlos a través del archivo functions.php? @birgire
