Как вывести форму комментариев через шорткод, убрав её из стандартного положения?
Мне уже удалось вывести форму комментариев в области контента записи с помощью этого кода, который позволяет использовать шорткод [wpsites_comment_form]:
add_shortcode( 'wpsites_comment_form', 'wpsites_comment_form_shortcode' );
function wpsites_comment_form_shortcode() {
ob_start(); // Начало буферизации вывода
comment_form(); // Вывод формы комментариев
$cform = ob_get_contents(); // Получение содержимого буфера
ob_end_clean(); // Очистка и завершение буферизации
return $cform; // Возврат формы
}
Теперь мне нужно убрать форму комментариев из нижней части записи (стандартное расположение). Когда я отключаю её через админ-панель в "Записи - Редактировать - Комментарии - Не разрешать", она также исчезает из места, где отображается через шорткод. Как сделать так, чтобы форма отображалась только там, где размещён шорткод?

Версия #1
Следующий код работает для темы Twenty Fifteen:
/**
* Отображение формы комментариев через шорткод на страницах записей
* Удаление стандартной формы комментариев.
* Скрытие нежелательного сообщения "Комментарии закрыты" с помощью 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 );
где мы разрешаем шорткоду отображать форму комментариев только на страницах записей, которые поддерживают комментарии.
Здесь мы используем CSS, чтобы скрыть нежелательное сообщение Комментарии закрыты.
Версия #2
Вот альтернативный подход без использования 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();
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;
}

Версия №1 протестирована и работает с темой, которую я использую. Отлично!

Если я хочу также вывести список комментариев (comments_template) выше формы, мне потребуется создать ещё одну shortcode функцию для этого? Это аналогичный подход?

Я нашел кое-что здесь, но не уверен, что знаю как это применить: http://lists.automattic.com/pipermail/wp-hackers/2011-April/038832.html

Я попытался повторить "Версию #1" от birgire, упомянутую выше в ответе, чтобы отобразить список комментариев выше формы комментариев. Это сработало частично. Комментарии также отображаются в стандартном месте (внизу).
Я использовал это:
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 );

Я переопубликовал этот второй вопрос за пределами этих комментариев и, возможно, нашел решение, хотя оно может быть не самым лучшим способом. Вот здесь: http://stackoverflow.com/questions/28593898/how-to-display-the-comments-template-with-a-shortcode-in-wordpress/28594128

Отлично, не было времени проверить, постараюсь взглянуть завтра @rodrigonomada

Мне удалось достичь нужного результата, но частично путем удаления в дочерней теме тех частей, которые я не мог убрать через код. Я убрал вызов comments_template() из single.php и удалил comments_form() из comments.php (иначе форма отображалась там, где я использую шорткод для вывода списка комментариев). Интересно, есть ли негативные аспекты такого подхода по сравнению с фильтрацией через файл functions.php? @birgire
