Ответы пользователя по тегу WordPress
  • Как сделать MultiSite на WP с подгрузкой (а не копированием) постов, записей и т.д.?

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

    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;
    Ответ написан
    Комментировать
  • Как создать frontend формы с возможностями сохранения и редактирования?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Gravity Forms
    Ninja Forms
    Caldera Forms
    Torro Forms
    ...
    Да любой адекватный плагин для форм под WordPress предоставляет этот функционал.
    Ответ написан
  • Как оптимизировать сайт на wordpress+visual composer?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Бекенд у вас весьма шустрый:

    bf3ea512b4264ec0a546b7e2a70bafee.jpg

    Это весьма и весьма достойный результат. С сервером и на серверной стороне все в порядке. А теперь узкие места:

    1. Загрузка шрифтов с серверов Google. С вашим шустрым сервером имеет смысл шрифты стянуть себе и отдавать локально. Срежете секунды полторы:

    67053ff4cfef4f458eb6d4723a36a7e2.jpgab83df494f21431284650396046227eb.jpg

    2. Далее, есть проблема с несколькими стилями:

    vcare.uz/wp-content/plugins/js_composer/assets/lib...
    vcare.uz/wp-content/plugins/js_composer/assets/lib...
    vcare.uz/wp-content/plugins/js_composer/assets/lib...

    Они долго грузятся, можете сами в Developer Tools посмотреть. Проблема не только в том, что они долго грузятся, но и в том, что они встают в очередь так как расположены в подвале и из-за использования HTTP/1.1. Можно решить 2мя путями:

    - конкатенация в один файл
    - использование HTTP/2

    В идеале, можно искать баланс между HTTP/2 + выборочная конкатенация.

    3. Файлы

    - new.vcare.uz/wp-content/uploads/2017/08/header-1.j...
    - new.vcare.uz/wp-content/uploads/2017/08/bg-white22...

    С ними 2 проблемы:

    - грузится с поддомена (+ DNS lookup и прочие потери на новый коннект)
    - динамический параметр, который предотвращает кеширование файла на стороне клиента

    Перенесите файл на основной домен и уберите параметр.

    4. Contact Form 7

    7cad4ec44dba469b86e2fbaa7c31558d.jpg

    У вас 7 (!!!) аякс-запросов этот плагин генерит. Я так понимаю, это 7 разных форм на странице. Запросы запускаются достаточно рано в цикле жизни страницы, и блокируют других ресурсов, занимая соединения с сервером. По протоколу HTTP/1.1, насколько я помню, браузер открывает до 6 соединений с сервером. В вашем случае, часть из этих 6 к моменту вызова этих ajax-запросов уже занята, и они встают в очередь друг за другом, вместе с другими ресурсами. Это умножает время ожидания. Переход на HTTP/2 заметно снизит влияние, но желательно избавиться от них вообще. Я бы советовал заменить CF7 на более адекватный плагин. Попробуйте, к примеру, Torro Forms (толковый и бесплатный, еще и с нормальным интерфейсом).

    5. Еще один запрос к admin-ajax.php

    f94caf0158b642b2958aefe1b9825ae5.jpg

    Собственно, он инициирован Visual Composer'ом - это Masonry сетка. Возможно, он у меня дозапустился потому что я начал скролить страницу и докрутил до того места, где он нужен. Возможно, он не запускается по умолчанию и проблемой не является.

    6. Front-end performance (парсинг и рендеринг):

    1691686d9b5f493fb147d10e0da4a894.jpg

    Парсинг скриптов занимает много времени, ибо их много. Но от этого можно избавиться только путем уменьшения их количества, что, возможно, не вариант. А вот второй очень тревожный сигнал - это как раз время ожидания (Idle). Это как раз говорит о невозможности браузера продолжать работу на каких-то этапах из-за того, что он ждет пока прилетят запрошенные ресурсы. Переход на HTTP/2 крайне желателен + замена CF7. Это как раз тот случай, когда HTTP/2 должен дать ощутимый эффект.

    Ну это так, беглый анализ. Посмотрите результаты тестирования тут: https://tools.pingdom.com/#!/2GQ2d/http://vcare.uz/
    Ответ написан
    3 комментария
  • Как вывести метки у которых в slug присутствует определенное значеник?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Функция the_post_tags() мне неизвестна. В коде WP такой нет. Подозреваю, вы имели в виду the_tags().

    Данная функция (the_tags()) выводит список тегов, строкой. А для обработки в цикле foreach вам нужно во-первых данные получить (нужна функция которая возвращает данные а не выводит), а во-вторых возвращаемые данные должны быть массивом, а не строкой.

    $tags = get_the_tags();
    
    foreach ( $tags as $tag ) {
        if ( strpos( $tag->slug, '_en' ) !== false ) {
            echo $tag->name;
        }
    }
    Ответ написан
    1 комментарий
  • Как посмотреть все хуки wp_head() c указанием файлов или сразу кода функций?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    В дополнение к Debug Bar могу посоветовать:

    Query Monitor - для отладки в целом, ну и хуков тоже

    ce4e138638484564972545d38b5e8f29.pngWP Inspect - конкретно по хукам

    536ab5e2550a49bfa5282d60f3c8a141.png
    Ответ написан
    Комментировать
  • Как вывести записи только из дочерних рубрик?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    О боги, ну сколько можно повторять, никогда не используйте query_posts!

    1. Используйте WP_Query или хук pre_get_posts
    2. В WP_Query используйте Tax_Query:
    $args   = [
        'posts_per_page' => 10,
        'tax_query'      => [
            'relation' => 'AND', // объединяем результаты по двум инструкциям
            // Инструкция 1 - получить все посты из родительской категории и ее потомков
            [
                'taxonomy'           => 'category',
                'field'                    => 'slug',
                'terms'                  => 'special_cat',
                'include_children' => true,
            ],
            // Инструкция 2 - а теперь исключить все посты родительской категории
            [
                'taxonomy'            => 'category',
                'field'                     => 'slug',
                'terms'                   => 'special_cat',
                'include_children' => false,
                'operator'              => 'NOT IN',
            ],
        ],
    ];
    $result = new WP_Query( $args );
    Ответ написан
  • Как заставить wp_head() выводить ссылки с https?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Посмотрел код, у вас там только вот это на http
    <link rel="profile" href="http://gmpg.org/xfn/11">
    Но оно так и должно быть. Все остальное на https. Возможно, кеш?
    Ответ написан
  • Как организовать управление статьями кастомных страниц для пользователей?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    То, что вы хотите, реализуется многими плагинами, поищите на wordpress.org/extend/plugins. Впрочем, если хотите пойти путем джедая, разложу по полочкам.

    Пользователи сайта (сайт на WP) регистрируются.

    Стандартная фича. Но если не хотите логин/регистрацию через родную форму, пишите свою. Смотрите функции register_new_user() и wp_insert_user().

    Одни могут делать отзывы и подписываться на рассылку, вторые могут создавать свои странички и заполнять инфо.

    Для начала, вам понадобятся разные роли. Читаем Roles and Capabilities. Можно использовать плагин для создания ролей.

    Далее, если вы хотите чтобы пользователи на фронтенде сайта могли данные редактировать, вам понадобится создать страничку, скажем, "Account". Далее для нее добавьте endpoints нужных "виртуальных страничек". Вывод endpoint'ов проводите через проверку ролей и показывайте пользователю только нужные.

    Вообще такой контент хранится у меня через ACF и PODS. Как сделать интерфейс управления страничками и параметрами для пользователей? Чтобы человек зашел, и мог добавить, например, свою компанию, редактировать её инфо.

    А теперь для каждого созданного endpoint делаете темплейт, соответствующую форму, и обработчик этой формы. Для создания записей вам пригодятся функции wp_update_post(), update_post_meta().

    И да, не забываем про проверку авторизации, ролей, редиректы где нужно, валидацию и санитизацию всех входящих данных, очистку данных на выводе и тд. В общем, стандартные моменты.
    Ответ написан
    Комментировать
  • Как вывести метки внутри записи?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    eval() не использовать. Никогда.

    Подобные моменты решаются через шорткоды.

    1. В functions.php
    function post_tags_within_content() {
        global $post;
        $tags = get_the_tag_list( '<p>'Tags: , ', ', '</p>', $post->ID );
        return $tags;
    }
    add_shortcode( 'tags', 'post_tags_within_content' );

    2. Использование в контенте поста:
    [tags]
    3. Получаемый результат:
    ...
    <p>Tags: tag1, tag2, tag3</p>
    ...

    при этом tag1, tag2, tag3 будут ссылками на соответствующие термины.

    Параметры функции get_the_tag_list() - в документации.
    Ответ написан
    Комментировать
  • Пагинация с множественным wp_query + offset's?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Пагинация работает от основного запроса (Main WP_Query), а не от кастомных, и оффсеты тут ни при чем.
    Ответ написан
    Комментировать
  • Wordpress плагин устанавливается на английском, почему?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Попробуйте зайти в Dashboard - Updates, и посмотреть, нету ли блока Update Translations. Вполне возможно, сам плагин поставляется из коробки без всех файлов переводов, и после активации плагина их надо докачивать.
    Ответ написан
  • Что делать с индексированием страниц на WordPress после Joomla?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Сделайте редиректы или возврат 404 на уровне сервера. Если Apache - в .htaccess, если Nginx - создайте отдельный файл с редиректами и в конфиге виртуального хоста подключите его.
    Ответ написан
    1 комментарий
  • Как сделать отображение таксономии в админке по условию?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    2 варианта.

    1. Javascript. По умолчанию визуально скрываете метабокс (CSS). При выборе чекбокса в метабоксе категорий проверяете его значение, если оно совпадает с нужным - показываете метабокс, если нет - прячете. Плюс - работает "на лету", даже с черновиками, нет необходимости сохранять запись чтобы увидеть результат.

    2. PHP. Хукаетесь в do_meta_boxes, проверяете есть ли нужная вам категория у записи, если нет - делаете remove_meta_box() для вашей таксономии. Плюс - метабокс не выводится вообще, если он не нужен. Минус - записи сначала надо присвоить категорию и сохранить, чтобы метабокс появился.
    Ответ написан
    4 комментария
  • Как добавить новый тип записей в WordPress и сделать гибкий фильтр по ним?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    1. Статьи делаются на основе стандартного типа записей 'post'
    2. Игры делаются через произвольный тип записи (custom post type) 'game'
    3. Чтобы и игры, так же как статьи, можно было складывать в категории:
    - если категории нужны те же, что и для статей, то для cpt 'game' дополнительно подключается стандартная таксономия 'post_category'
    - если для игр нужны свои уникальные категории, то регистрируется произвольная таксономия 'game_category'
    4. Все дополнительные характеристики/свойства игр пропускайте в голове через такой фильтр:
    - если набор терминов (значений) в характеристики плюс-минус понятен (например, жанры игр), по нему нужна фильтрация запросов, а также сам термин может иметь дополнительные данные (как минимум, описание) - тогда для этой характеристики подходит произвольная таксономия (в вашем случае - платформа, жанр)
    - если значения характеристики могут быть разными, отсутствовать вообще, быть достаточно большим текстом, не нужны для полноценной фильтрации через основной запрос и тд (например, в вашем случае это "особенности") - тогда для этой характеристики подходит произвольное поле (custom field / post_meta)
    Ответ написан
    Комментировать
  • Wordpress Кэширует php?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    PHP WordPress кешировать не может по определению. Сам PHP может кешироваться самим PHP, через opcache (о чем вам уже написали). Что WordPress действительно может кешировать, так это данные. С помощью Transients API и Object Cache API. Соответственно, смотрите наличие класса object-cache.php в папке wp-content, и записи со словом transient в таблице wp_options. Для работы с transients (и их очистки) можете использовать плагин Transients Manager.
    Ответ написан
    Комментировать
  • Как изменить в адресной строке имя шаблона страницы?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Это стандартный rewrite rule для post formats. Его можно модифицировать через хук post_format_rewrite_rules. Хукаетесь в него, он принимает в виде параметра массив правил в формате "регулярное выражение" => "урл с параметрами". Далее можете циклом пройтись по ним, заменить все что надо. После этого надо пересохранить правила.
    Ответ написан
    1 комментарий