• Как прервать закачку файла при закрытии страницы?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    У Nginx есть 3 полезные директивы:

    reset_timedout_connection on; # 1
    client_body_timeout 5; # 2
    send_timeout 2; # 3


    Что они делают:

    # 1 - Если клиент перестал читать отвечать от сервера, Nginx будет сбрасывать соединение с ним, освобождая ресурсы.

    # 2 - Ограничение времени ожидания тела запроса от клиента. Если тело запроса не пришло в этот интервал, Nginx сбросит соединение.

    # 3 - Если клиент прекратит чтение ответа, Nginx подождет заданный интервал и сбросит соединение.

    По умолчанию эти значения весьма высоки. Если я правильно понимаю ваш вопрос, то по сути Nginx это и так делает (сбрасывает соединение с отвалившимся клиентом), но делает это не сразу (в момент закрытия вкладки браузера), а по истечении некоторого времени. Уменьшив эти интервалы можно заставить Nginx сбрасывать соединения сильно раньше. Но и слишким низкие значения не стоит использовать - в этом случае медленные клиенты будут посланы куда подальше. А половина мобильных клиентов в половине мобильных сетей - медленные.
    Ответ написан
    Комментировать
  • Хранение html разметки в файлах локализации?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Хорошо ли? Спорный вопрос, но насколько мне известно, другого варианта из коробки нет. Главное соблюдать 2 правила:

    1. Избегать разметки как таковой (div, header и тому подобное) в файлах перевода. Ограничиваться inline-элементами форматирования, такими как strong, sub и тд. Если приходится вставлять большой кусок c более общими тегами, вероятно его стоит разбить на более мелкие фразы.
    2. Не забывать выводить правильно с помощью {!! $string !!}
    Ответ написан
    Комментировать
  • Как реализовать мультиязычность?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Если мультиязычка зеркальная - каждая страница или статья/новость имеет перевод на другой язык, тогда один сайт и плагин для мультиязычки - WPML (платный) или Polylang (бесплатный, платные add-ons).

    Если контент (структура сайта, страницы, записи и тд) на языковых версиях отличается - тогда WordPress Multisite.

    Все остальное выбросьте из головы.
    Ответ написан
    2 комментария
  • Как получить комментарии к каждому посту в списке?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    1. Получить посты (1 запрос, если не тянуть и не праймить кеши метаданных и таксономий).
    2. Из массива постов выдернуть их IDшки (wp_list_pluck или аналогичным методом).
    3. Получить комменты c помощью WP_Comment_Query, передав IDшки из п.2 в свойство post__in (1 запрос, если не тянуть и не праймить кеши метаданных и постов)
    4. Вывести посты циклом, в каждой итерации забирать необходимые комменты из результата п.3

    Итого: 2 запроса.

    Впрочем, в реальной жизни вам все-таки понадобятся метаданные как постов, так и комментов. Поэтому запросов будет больше, но не N+1.

    А вообще такие штуки не мешало бы кешировать целиком, или хотя бы результаты запросов, в transients. На какой период - зависит от частоты обновления инфы на сайте. От 5 минут до часа.
    Ответ написан
    Комментировать
  • Wordpress. Как обновить все записи, их более 2000?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Что значит обновить? Дату и время последнего изменения обновить? Как кросспостинг отслеживает изменения? Я вообще подозреваю, что он висит на хуке сохранения поста в вадминке. Соответственно, только ручками пересохранять, или же писать скрипт, который будет циклом идти по постам и вызывать соответствующую функцию/метод плагина.
    Ответ написан
    Комментировать
  • Wordpress: собственный обработчик POST-запросов?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    1. Аякс не обязателен в вашем случае.
    2. Использовать совет MrTimon тем более не стоит (хотя этот метод является правильным).

    В вашей ситуации наиболее простым и адекватным решением будет по старинке постить форму саму на себя (на текущий урл), хукаться в init и выполнять необходимые действия.

    UPDATE: В комментариях обсуждение и детали.
    Ответ написан
  • Git на продакшин сервере?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Думал уже как вордпрещики архивами все делать

    А вот это щас обидно было! :)

    По делу - используйте автоматический деплой. Сама схема "по уму" выглядит следующим образом:
    - деплоится не мастер, а тег/релиз
    - каждый такой релиз деплоится в отдельную папку
    - тестируете это добро на поддомене
    - если все ок, тогда на проде переключаете сервер на папку нового релиза
    - профит

    При таком подходе получаете очевидные плюсы:
    - на сервер лазить ручками не нужно, обезьяний труд должен быть автоматизирован
    - деплой происходит без downtime
    - у вас сохраняется предыдущее стабильное состояние, в случае проблем с новой версией вы легко переключаете сервер на предыдущую папку, откатываясь таким образом к last stable
    - при желании можно даже a/b тестирование делать
    Ответ написан
    5 комментариев
  • Как сделать выдачу записей по релевантности Wordpress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Вы для начала определитесь четко, что вы вкладываете в понятие "релевантность". Конкретные параметры, их вес и тд. А тогда запилите руками. WP из коробки использует совсем базовый поиск - нахождение искомого слова/фразы в БД по некоторым полям.

    Посмотрите в сторону ElasticSearch + ElasticPress.
    Ответ написан
  • Почему не работает трансляция?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    А если вот так:

    <?php
    /**
     * Plugin Name: Translation demo
     */
    namespace langdemo;
    
    if (!defined('WPINC')) {
        die;
    }
    
    function run() {
        require_once plugin_dir_path(__FILE__) . 'class-plugin.php';
        $plugin = new Plugin();
        $plugin->run();
    }
    
    add_action( 'plugins_loaded', 'run' );
    Ответ написан
    Комментировать
  • Как удалить или скрыть текстовый редактор?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    css / js
    Ответ написан
    Комментировать
  • Залить CSV файл в БД при наличие произвольных полей в записях?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Ответ написан
    Комментировать
  • Не отображаются страницы таксономий в произвольном типе записей, что делать?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    У вас одинаковый slug и у post type, и у taxonomy. Соответственно, будет срабатывать первое правило из двух, а именно правило custom post type. В вашем случае, при попытке открыть урл test.com/exercises/street WP будет искать запись типа exercises (custom post type) со слагом street. Такой записи нет, отсюда 404. Термин таксономии он искать не будет, так как Rewrite API работает по принципу "нашли первое совпадение и прекратили проверку".
    Ответ написан
    Комментировать
  • Как правильно обработать кастомную форму wordpress с админки?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Хукайте в admin_post_*

    Еще почитать: https://www.sitepoint.com/handling-post-requests-t...
    Ответ написан
    Комментировать
  • Какой идеальный вариант хостинга для Wordpress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    1. VPS c 2мя ядрами проца, SSD и минимум 4Гб оперативы (потому что у вас много сайтов и всем нужно раздать места в кеше), у нормального хостера который не оверселлит, по крайней мере явно. Проверенные - Amazon AWS, Digital Ocean. Да, и без swap.
    2. FreeBSD
    3. Nginx, сертификаты Let's Encrypt, HTTP/2
    4. PHP-FPM 7.1
    5. MariaDB 10.2
    6. Memcached или Redis
    7. Адекватные настройки всего этого дела
    8. Адекватные плагины кеширования (drop-ins для объектного кеша и для full-page кеширования где оно имеет смысл)
    9. Все упомянутые сервисы через сокеты
    10. Опционально - Varnish, HAProxy для SSL termination, Nginx fastcgi_cache для кеширования страниц целиком (где в этом есть смысл, вместо плагина на уровне WP)
    11. Для управления всем этим не использовать Plesk, Vesta, ISP и прочую ересь. Учитесь делать все руками и самостоятельно.

    Вообще, как говорится, дьявол всегда кроется в деталях. Иногда вопрос упирается исключительно в настройки - то fpm pool некорректно настроен, то open table cache в MySQL, то слишком долгий keep alive у Nginx, то упираетесь в лимит открытых файлов, то не кешируется достаточное количество файловых дескрипторов и тд. Корректные настройки всех сервисов под конкретные потребности конкретных сайтов - ключ к успеху.

    Ну и, конечно, самое-самое главное - адекватный код самих сайтов. Ибо одна говнотема "все-в-одном" с парочкой таких же говноплагинов способна ронять даже хорошо настроенный сервер.
    Ответ написан
    2 комментария
  • Как сделать MultiSite на WP с подгрузкой (а не копированием) постов, записей и т.д.?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Если вопрос в выводе данных на фронте (то есть, чтобы дочерние сайты просто показывали записи с главного сайта сети) - попробуйте switch_to_blog / restore_current_blog. Переключились на главный сайт, вытянули посты, переключились обратно. Ну или REST API пробуйте, тоже вполне вариант.
    Ответ написан
    3 комментария
  • The query cache is deprecated as of MySQL 5.7.20, что это значит и чего ждать?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Query cache вообще штука весьма неоднозначная, и лучше всего query_cache_size устанавливать в 0. Поэтому, не велика потеря. Для тех, кто давно так делает, последствий никаких. Для тех же, кто на него полагался, предстоит немного чтения и ковыряния в коде.
    Ответ написан
    Комментировать
  • Как добавить условие, при котором которое будет исполнять функцию через раз?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    function ads_h2( $content ) {
    
    	// Хорошая практика, называется "return early"
    	if ( ! is_single() ) {
    		return $content;
    	}
    
    	// Заготовили код рекламы
    	$ad = '[AD]';
    
    	// Инициализировали счетчик
    	$count = 1; // 0 или 1, по ситуации
    
    	// Делаем замену через коллбек
        $content = preg_replace_callback(
            '#<h2(.*?)</h2>#',
            // С помощью use передаем в замыкание дополнительные параметры
            function( $matches ) use ( &$count, $ad ) {
                // Увеличиваем счетчик
                $count++;
                // Если число четное, добавляем рекламу
                if ( $count % 2 == 0 ) {
    	            return '<div class="ads_content">' . $matches[0] . $ad . '</div>';
                // Если нечетное - ничего не делаем
                } else {
                    return $matches[0];
                }
            },
            $content
        );
    
    	// Вернули измененный контент
    	return $content;
    }
    add_filter( 'the_content', 'ads_h2' );


    Бонус

    Если менять цифру в if ( $count % 2 == 0 ) { вместо 2 на, скажем, 3 или 4, то реклама будет выводиться, соответственно, в каждом 3м или 4м подзаголовке.
    Ответ написан
    2 комментария
  • Зачем делать дочерние страницы wordpress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Вы путаете теплое с мягким.

    Страницы (pages) это один тип данных, он не поддерживает (по умолчанию) категории. Зато поддерживает дочерние страницы. Нужно это как раз для того, чтобы у страницы были подстраницы, с более детальным контентом, например.

    Разбивка же не-иерархического контента (посты, записи, они же posts) происходит как раз с помощью таксономий (categories, tags и произвольные таксономии).

    А теперь, с учетом вышеизложенного, уточните вопрос.

    ЗЫ: А по поводу пропадающего фонового изображения - спросите в канале по CSS, и обязательно ссылку прикрепите. Диагностику делать без пациента - гиблое дело.
    Ответ написан
    Комментировать
  • Как ограничить в вордпресс количество рубрик по циклу?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Из документации:


    'number'
    (int|string) Maximum number of terms to return. Accepts ''|0 (all) or any positive number. Default ''|0 (all).


    То есть, вот так:

    $args = array(
        ...
        'number' => 10, // нужное количество (максимальное)
        ...
    );
    $cats = get_categories($args);


    Это что касается вашего прямого вопроса. А также, не нужно делать вот это:

    $category = get_term($cat)

    и вот это:

    echo get_cat_name($category->term_id);

    потому что функцией get_categories() вы уже получили массив объектов WP_Term, которые содержат все необходимые данные. Вот вам отрефакторенный код, который не делает ничего лишнего:

    $args = array(
    	'parent'         => 0,
    	'hide_empty'     => 0,
    	'exclude'        => array( 11, 1 ),
    	'number'         => 10,
    	'taxonomy'       => 'category',
    	'posts_per_page' => 1,
    	'pad_counts'     => true
    );
    
    $cats = get_categories( $args );
    
    foreach( $cats as $cat ) :
    
    	echo $cat->name;
    	echo $cat->description; 
    
    endforeach;
    Ответ написан
    Комментировать