Cum să afișezi comment_form cu un shortcode și să-l elimini din poziția implicită?
Am reușit deja să afișez formularul de comentarii în zona de conținut a postării folosind acest cod, care îmi permite să utilizez shortcode-ul [wpsites_comment_form]:
add_shortcode( 'wpsites_comment_form', 'wpsites_comment_form_shortcode' );
function wpsites_comment_form_shortcode() {
ob_start(); // Pornim bufferizarea output-ului
comment_form(); // Afișăm formularul de comentarii
$cform = ob_get_contents(); // Obținem conținutul bufferizat
ob_end_clean(); // Oprim bufferizarea și curățăm
return $cform; // Returnăm formularul
}
Ce am nevoie acum este să elimin formularul de comentarii de la partea de jos a postării (afișarea implicită). Când îl elimin prin panoul de administrare în Postări - Editare - Comentarii - Nu permite, acesta este eliminat și din locația unde este afișat prin funcția shortcode. Deci cum pot face să apară doar acolo unde este plasat shortcode-ul?

Versiunea #1
Următoarea soluție pare să funcționeze pentru tema Twenty Fifteen:
/**
* Afișează formularul de comentarii prin shortcode pe paginile singular
* Elimină formularul implicit de comentarii.
* Ascunde mesajul nedorit "Comentariile sunt închise" cu 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 );
unde permitem ca shortcode-ul să afișeze formularul de comentarii doar pe articolele singular care acceptă comentarii.
Aici folosim CSS pentru a ascunde mesajul nedorit Comentariile sunt închise.
Versiunea #2
Iată o altă abordare fără CSS:
/**
* Afișează formularul de comentarii prin shortcode pe paginile singular.
* Elimină formularul implicit de comentarii.
* Ascunde mesajul nedorit "Comentariile sunt închise" prin filtre.
*
* @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;
}

Versiunea #1 testată și funcționează cu tema pe care o folosesc. Grozav!

Dacă vreau să afișez și lista de comentarii (comments_template) deasupra formularului, voi avea nevoie de o altă funcție shortcode pentru asta? Este o abordare similară?

Am găsit ceva aici, dar nu sunt sigur că știu cum să o aplic: http://lists.automattic.com/pipermail/wp-hackers/2011-April/038832.html

Am încercat să reproduc "Versiunea #1" a lui birgire, menționată mai sus în răspuns, pentru a afișa lista de comentarii deasupra formularului comment_form. A funcționat parțial. Afișează comentariile și în locația implicită (jos).
Am folosit asta:
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 );

Am repostat această a doua întrebare în afara acestor comentarii și poate am găsit o soluție, deși poate nu este cea mai bună metodă. Aici: http://stackoverflow.com/questions/28593898/how-to-display-the-comments-template-with-a-shortcode-in-wordpress/28594128

ok super, nu am avut timp să verific, voi încerca să arunc o privire mâine @rodrigonomada

Am reușit să ajung la rezultatul de care aveam nevoie, dar parțial prin ștergerea din child-theme a părților pe care nu le-am putut elimina prin cod. Am eliminat apelul comments_template() din single.php și am eliminat apelul comments_form() din comments.php (altfel ar fi apărut acolo unde folosesc shortcode-ul pentru a afișa lista de Comentarii) Mă întreb dacă există aspecte negative în a face asta în acest fel în loc să le filtrez prin fișierul functions.php? @birgire
