Задать вопрос
  • Зарплаты front-end разработчиков превысили зарплаты back-end разработчиков. Так ли это?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Зарплата зависит от уровня и квалификации, опыта, умения решать сложные задачи в разумные сроки, надежности, отзывов и репутации и еще десятка факторов, вплоть до владения смежными технологиями. Бекенд или фронтенд - не столь существенно.
    Ответ написан
    Комментировать
  • Как вылечить сортировку кириллицы в get_terms?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Скорее всего в таблицу с кодировкой UTF данные записаны не-UTF. В былые времена лентяи лечили с помощью ORDER BY binary(column_name), но я не уверен, что поможет (к тому же, тут хукаться надо в posts_orderby). Либо перелопачивать данные в бд.
    Ответ написан
  • Как запустить функцию если опубликован пост или стоит "галочка"?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    1. А если убрать $old_status != 'publish'?
    2. Добавлять прям "перед кнопкой опубликовать" не очень просто, зачем хакать. Используйте add_metabox.
    3. А почему бы не повесить вызов вашей функции на save_post вместо transition_post_status? И в нем дополнительно проверять не делается ли autosave и подходящий ли статус ('pusblish', чтобы драфты не улетали).

    UPD: Уточнение и решение в комментах к ответу.
    Ответ написан
    4 комментария
  • Система "уровней(экспинга)" для wordpress. Как лучше организовать хранение данных в mysql?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Все можно (и разумно) реализовать встроенными средствами.
    1. Храните данные в таблице wp_usermeta
    2. Используйте WP_User_Query, а именно meta_query для получения данных по уровням/опыту + date_query для группировки и сортировки результатов по периодам.

    ЗЫ: Это в случае, если ваши юзеры-игроки являются и аккаунтами (юзерами) WordPress. Если нет, например игрок это custom post type - тогда используйте WP_Query.
    Ответ написан
    6 комментариев
  • Кто разбирается в nav_walker?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Обратитесь к свойству $item->post_parent.
    https://css-tricks.com/the-wordpress-nav-walker-cl...
    Ответ написан
    Комментировать
  • Какой оптимальный размер изображения на странице со списком записей?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Ну если прям надо чтоб по красоте на ретине - реальный физический размер в пикселях * 2. Но вообще WordPress уже сам умеет показывать ретине нужные картинки. https://make.wordpress.org/core/2015/11/10/respons...
    Ответ написан
  • Как писать приложение для сайта, который написан на wordpress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    REST API, только не то, которое советует Дмитрий Воронков, а то, которое в процессе мерджинга в ядро WP. Собственно, v2.wp-api.org.
    Ответ написан
    Комментировать
  • Как сделать пагинацию по своей выборке?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Ничего не понятно :)

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

    Тогда да, вы делаете неправильно. Пагинация привязана к основному запросу. Вам его надо менять через хук pre_get_posts, вместо того, чтобы вторичный запрос создавать. Если же страница такова, что вторичный запрос для другого типа контента неизбежен, то в нем нужно запрашивать как раз вторичный контент, который не требует пагинации.

    Уточните вопрос и покажите код, тогда легче будет помочь.
    Ответ написан
  • Wordpress Autoptimize, почему не получается отключить?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    add_filter('autoptimize_filter_noptimize','my_ao_noptimize',10,0);
    function my_ao_noptimize() {
    	if (strpos($_SERVER['REQUEST_URI'],'слаг-страницы')!==false) {
    		return true;
    	} else {
    		return false;
    	}
    }

    Собственно, код от самого автора плагина. Взято тут.
    Ответ написан
    Комментировать
  • WordPress get_num_queries() в среднем 100 запросов для главной, это много?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    1. ~100 - это и не мало, и не много. Вполне себе рабочее значение, особенно для WP + ACF (в этом случае это даже скорее мало).
    2. Объем используемой памяти очень даже в норме.
    3. Время выполнения 200мс - нормально. Не супер, но вполне норм. Ведь речь тут идет о выполнении всего, а не только запросов к БД. Вот если бы только эти 100 запросов в БД столько выполнялись - то это уже печалька.

    Дополнительно:

    4. Используйте плагин Query Monitor для детальной статистики, в том числе по времени выполнения запросов к БД.
    5. Используйте object cache (memcached / redis на сервере + плагин для WordPress), и сам WP, и ACF складывают туда запросы к БД, что заметно ускоряет работу.

    И главный можно ли понять по этой информации сколько посетителей выдержит хостинг

    Нет :) Нужно знать параметры хостинга + настройки nginx/apache, php, mysql, того же memcached/redis (если они есть). Да и самой ОС на сервере, если честно. I/O, лимиты открытых файлов, кеши дескрипторов, даже TCP Congestion Control может иметь колоссальное значение.
    Ответ написан
    1 комментарий
  • Поможете с циклами wordpress?

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

    SPECIAL NOTE: When there are multiple posts on a page published under the SAME DAY, the_date() only displays the date for the first post (that is, the first instance of the_date()). To repeat the date for posts published under the same day, you should use the Template Tag the_time() or get_the_date() (since 3.0) with a date-specific format string.

    Use <?php the_time( get_option( 'date_format' ) ); ?> to add the date set in the admin interface.
    Ответ написан
    2 комментария
  • Почему WP_Query{} не работает?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Потому что у вас мешанина из php и html, без открывающих и закрывающих php-тегов в нужных местах. Ну и сам код не там где надо.
    <?php
    $args = array(
        // Аргументы для запроса.
    );
    
    // Произвольный запрос.
    $query = new WP_Query( $args );
    
    // Проверка результатов запроса.
    if ( $query->have_posts() ) {
        // Начало цикла
        while ( $query->have_posts() ) {
            $query->the_post();
    
    // Перед выводом html необходимо закрыть php-тег
    ?>
    
    <div class="item wow bounceInUp" data-wow-offset="10">
        <span><i class="fa fa-briefcase"></i></span>
        <div class="wrap-content">
            <h2><?php the_title() ?></h2>
            <?php the_content() ?>
        </div>
    </div>
       
    <?php // А если снова перешли к php - снова открываем тег
        } // А тут закрыли цикл while
    } // А тут закрыли if
    
    // Восстановление исходных данных записи.
    wp_reset_postdata();
    ?>


    В общем, мухи отдельно, котлеты отдельно.
    Ответ написан
    Комментировать
  • Как настроить доступ по ip в nginx?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    # Возможные контексты: http, server
    server {
        ...
        # Запретить доступ всем кроме разрешенных IP
        allow 192.168.1.0/24;
        deny all;
        ...
    }
    Ответ написан
    2 комментария
  • Какую расширяемую платформу для блогов выбрать?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Ну, если для блога не подошел ни WordPress, ни Ghost, то ничего больше не подойдет. Но, я практически уверен, что проблема не в кошке, а в том, что вы не умеете ее готовить.

    большая кастомизируемость

    куда уж больше чем у WordPress?

    есть доступ к базе данных и есть возможность изменить или дополнить базу данных в плагинах

    все это есть в WordPress, и очень просто и удобно. dbDelta(), $wpdb, WP_Query и тд

    Адекватный текстовый редактор. Желательно, чтобы была возможность задействовать пространство слева и справа от основного блока. Желательно, чтобы была возможность совместной работы с помощью коментариев так же, как сделано в Dropbox Paper (не так важно, но желательно, можно обойтись самим Dropbox Paper).

    Редактор у WP нормальный, задействовать пространство справа и снизу можно как угодно, для этого есть Metaboxes. Есть даже версионирование ака revisions! Совместная работа есть. Для комментирования процесса есть ряд editorial плагинов, которые прекрасно решают эту задачу.

    Желательно, чтобы были предусмотрены плагины и темы

    Есть в WordPress, плюс хуки. Очень мощная и гибкая штука.

    Желательно, чтобы процесс добавления статьи можно было произвольно менять и чтобы плагины оргонично встраивались в этот процесс, а не сбоку, как это сделано в Wordpress.

    Эммм... А можно подробнее, что значит "произвольно менять процесс добавления статьи" и "органично встраиваться в процесс"? Если уж прям никак не можете подружиться с хуками, ну используйте REST API, стройте свой процесс. Что конкретно не устраивает в WordPress?

    Желательно, чтобы была удобная работа с картинками: сжатие без потерь, поддержка ретина, использование изображений меньшего разрешения на телефонах, ленивая загрузка изображений (не обязательно).

    WordPress. Качество меняется одной опцией, если надо уж совсем можную системку для сжатия и оптимизации - есть отличные плагины. Поддержка ретины есть из коробки. Поддержка меньших размеров для телефонов есть из коробки. Ленивая загрузка элементарно подключается, например в Jetpack.

    Хорошая аналитика или база для аналитика, чтобы можно было как в medium, учитывать до куда доскролил пользователь, сколько провёл времени, читал ли этот пользователь блог раньше и всё такое. Абсолютно не обязательно, эту возможность готов написать сам.

    Ни в одной платформе из коробки такого функционала не будет, потому что это совершенно другая кухня. Ставьте на сервер Piwik, пилите плагин для его интеграции.

    Возможности для сплит-тестирования. Может понадобиться несколько версий текста одновременно, чтобы показывались разным пользователям в разное время.

    Опять же, это внешний, маркетинговый функционал, никто его не станет впиливать в платформу для блога. Для этого есть плагины. Например, совсем недавно для WordPress вышел шикарный плагин Ingot, со дня на день должна выйти бесплатная версия для WordPress.org

    В общем, мой вердикт - вы в своем вопросе аккурат описали WordPress. Проблема не в нем, а в том, что вы его не знаете, не представляете всех возможностей.
    Ответ написан
    2 комментария
  • Как заставить вордпресс запускать стандартный шаблон записи после if?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    function single_partner_template( $single_template ) {
        if ( is_single( array( 891, 215, 3644, 1055, 2122, 2104, 1962, 3702, 6281, 1442 ) ) ) {
            $single_template = dirname( __FILE__ ) . '/single-partner.php';
        }
        return $single_template;
    }
    add_filter( 'single_template', 'single_partner_template' );

    Фильтры всегда принимают в себя входящие данные. Не нужно их целиком заменять (в большинстве случаев), достаточно добавить исключение с помощью if, в противном случае возвращать неизмененное значение.

    Еще поправил форматирование кода (Coding Standards же) и изменил название функции на более логичное и понятное.

    ЗЫ: И еще у тебя в 7 строчке лишняя точка с запятой. Parse error и все дела.
    Ответ написан
  • Если записи с таким ID, то... а если нет, то... Вордпрес, как?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Conditional Tags
    Например, в single.php, там где вы показываете рекламу:
    <?php
    $page_ids = array( 11, 34, 76, 237 ); // ID постов
    if( is_single( $page_ids ) ) {
        // тут показываем рекламу которая нужна на страницах этих постов
    } else {
        // тут показываем рекламу для всех остальных постов
    }
    Ответ написан
  • При увеличении количества товаров в Woocommerce появляется сообщение "Товары, соответствующие вашему выбору, не найдены". В чем проблема?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    > Количество входящих параметров в запросе PHP: 1000
    Это max_input_vars в php.ini, может быть причиной. Увеличивайте значение.

    > Ограничение времени выполнения PHP: 30
    Косвенно. 30с достаточно, если скрипт выполняется так долго - надо не лимит увеличивать, а выяснять почему он выполняется так долго.

    Одной из причин столь длительного выполнения может быть ожидание ответа от БД, которая очень долго делает выборку, если товаров много (ведь при выборках, особенно в фильтрах и сортировках, идут объединяющие запросы по таксономиям и/или метаданным). В данном случае надо тюнить базу в первую очередь.

    Еще было бы полезно понимать какие ресурсы на VPS.
    Ответ написан
    1 комментарий
  • Как подключить свои стили к редактору WordPress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Откуда вы взяли экшн current_screen? Замените на: add_action( 'admin_init', 'my_theme_add_editor_styles' );
    Ответ написан
    1 комментарий
  • Как наиболее оптимально настроить vps для одного сайта?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Сложно ответить что-то внятно, потому что вопрос = поток сознания, уровень подготовки вопрошающего слишком низок для того, чтобы самому настраивать и админить сервак. Ничего личного, не обижайтесь, но лучше обратитесь к специалисту. Потому что между вашим текущим состоянием и уровнем даже начинающего админа, способного самостоятельно все это сделать "по уму" - не менее 200-300 часов обучения и практики.

    По сути - мощности железа данного сервера достаточно для 100к в день. При грамотном использовании кеширования 100к в день выдержит без проблем и сервак с 1м ядром и 1Гб оперативы.
    Ответ написан
    3 комментария