Как вывести форму комментариев через шорткод, убрав её из стандартного положения?

5 февр. 2015 г., 22:59:54
Просмотры: 13.7K
Голосов: 3

Мне уже удалось вывести форму комментариев в области контента записи с помощью этого кода, который позволяет использовать шорткод [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; // Возврат формы
}

Теперь мне нужно убрать форму комментариев из нижней части записи (стандартное расположение). Когда я отключаю её через админ-панель в "Записи - Редактировать - Комментарии - Не разрешать", она также исчезает из места, где отображается через шорткод. Как сделать так, чтобы форма отображалась только там, где размещён шорткод?

0
Все ответы на вопрос 1
8

Версия #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;
}
6 февр. 2015 г. 13:02:33
Комментарии

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

rodrigo nomada rodrigo nomada
11 февр. 2015 г. 12:56:39

Рад слышать, что у вас всё работает, @rodrigonomada

birgire birgire
11 февр. 2015 г. 19:50:26

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

rodrigo nomada rodrigo nomada
18 февр. 2015 г. 19:45:42

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

rodrigo nomada rodrigo nomada
18 февр. 2015 г. 19:51:34

Я попытался повторить "Версию #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 );

rodrigo nomada rodrigo nomada
18 февр. 2015 г. 20:12:46

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

rodrigo nomada rodrigo nomada
19 февр. 2015 г. 03:17:28

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

birgire birgire
19 февр. 2015 г. 03:26:05

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

rodrigo nomada rodrigo nomada
20 февр. 2015 г. 01:28:03
Показать остальные 3 комментариев