Ответы пользователя по тегу WordPress
  • Wordpress php код - Как исправить?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Александр Зеленин дело говорит. query_posts - это утилитная функция, ее в этом случае юзать не стоит. Оптимально - хук в pre_get_posts, установить нужные параметры (категория, количество постов на страницу), тогда стандартный луп (WP_Query) сам по себе выдаст нужный результат, и больше ничего править не надо.
    Ответ написан
    Комментировать
  • Откуда растут ноги у "блока" в шапке сайта?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Этот блок генерит плагин Nivo Slider. Убрать его целиком - надо ручками править код плагина, скорее всего. Самый простой способ - дописать в CSS следующий блок:

    .nivo-controlNav { display: none; }
    Ответ написан
    4 комментария
  • Почему не меняется контент при смене страниц?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    В запросе идет 'post_type' => 'news', а далее вы говорите о таксономии news. Где логика? Бардак получается)

    Таки используйте стандартный цикл, хукайтесь в pre_get_posts. В крайнем случае используйте new WP_Query. query_posts() - весьма специфический зверь, который предназначен только для определенных ситуаций. Ваша - не одна из них.

    Что это за шаблон? category.php? index.php? single.php? Советую при разработке устанавливать плагин Query Monitor, он покажет как WordPress распарсил и обработал запрос, какой шаблон загрузил. Как вы живете без дебага? Я не говорю об xdebug, но хотя бы WP_DEBUG = true и Query Monitor должны быть.
    Ответ написан
    Комментировать
  • Как выводить записи вордпресс в модальном окне ?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Проверяйте значение глобальной переменной $post. Что конкретно вы отправляете в модальное окно? Отправлять туда просто ссылку (пермалинк) означает отправлять полноценный запрос, который выполнит инициализацию wp(), парсинг запроса, запросы в бд, загрузку шаблонов и т.д. Будут загружены целиком шапка и подвал темы, и т.д. Надо смотреть код, что именно вы там делаете. Без понимания среды и контекста помочь вам не представляется возможным.
    Ответ написан
    Комментировать
  • Как использовать визуальный редактор Wordpress в своих плагинах?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Ну wp_editor() же :)
    Ответ написан
    Комментировать
  • Оптимальные конфиги для связки: DigitalOcean(5$) + VestaCP + Wordpress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    1. Веста хоть и самая легкая из CP, но все же жрет ресурсы, а на дроплете за $5 их и так очень мало. Ну а для одного сайта зачем вообще контрольная панель?! Удалите к чертям. Ну или попробуйте объяснить, зачем вам эта панель вообще нужна. Уверен, смысла в ней нет.

    2. На минимальном дроплете надо все делать максимально продуманным и эффективным. Обязательно нужен swap 512Мб или даже 1Гб. Nginx, желательно последний mainline. PHP5-FPM с Opcache, для Opcache необходимо выделить 32Мб. Если сайтов больше чем 1 - возможно придется увеличить до 64Мб. Вместо MySQL ставим MariaDB. Обязательно ставим Memcached, php5-memcached (c буквой "d" в конце), ему даем 64-128Мб памяти. В WordPress устанавливаем плагин Memcached Redux (только внимательно читаем как его устанавливать - вместо активации плагина надо скопировать файл в wp-content). Это включит persistent object cache на уровне WordPress, большинство запросов вообще перестанет доходить до БД, а это самое узкое место на минимальном дроплете. Кроме того, если уж делать все серьезно, ставим плагин FFPC (Fast Full Page Cache), он позволит кешировать страницы целиком, а чуть поковырявшись с конфигами, можно кешировать страницы в Memcached (то есть в память), и отдавать их оттуда непосредственно Nginx'ом, даже не поднимая PHP-процесс, и уж тем более не касаясь базы данных. Объем памяти для Memcached, возможно, придется увеличивать - все зависит от объема сайта. Но при таком подходе вы получите очень высокую скорость отклика от своего маленького сервера, и он сможет выдерживать очень большие нагрузки. С полностью кешированным в память сайтом и отдачей Nginx'ом непосредственно из Memcached, а также с оптимизированным кодом и файлами (минификация и конкатенация скриптов и стилей, gzip, оптимизированные картинки и т.д., минимизация количества запросов и т.п.) данный дроплет за $5 сможет обслуживать и 50 000 просмотров в сутки. А это уже 1 500 000 в месяц. Даже пиковые 1-2-3 тысячи запросов (что будет крайне редко, если будет вообще) за короткий промежуток времени ("хабраэффект") пройдут еле-еле заметно - даже если начнет использоваться swap, на SSD-дисках он быстр. В итоге часть клиентов будут испытывать небольшие задержки, не более. Но это речь об одновременной тысяче посетителей на сайте, не меньше. К тому времени, как аудитория сайта дорастет до этого уровня, уверен вы уже перейдете хотя бы на дроплет за $10. А там ресурсов больше, при аналогичном подходе этот дроплет выдержит намного больше.
    Ответ написан
    5 комментариев
  • Как отображать страницу автора Wordpress, если у него нет постов?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    А пользователь после регистрации уже активирован?
    Возможно проблема не в в коде, а в url rewrite. Попробуйте сделать тест - зарегистрироваться как пользователь, после этого в другой вкладке обновить постоянные ссылки. Вернуться на вкладку с пользователем и проверить, есть 404я ошибка или нет.
    Вообще, неплохо было бы подебажить, хотя бы с помощью плагина Query Monitor. Он покажет, какой запрос, как его вордпресс распарсил, какой шаблон пытается загрузить и какой объект пришел из бд по запросу. Исходя из этих данных можно понять, откуда 404я.
    Ответ написан
    Комментировать
  • Как сделать, чтобы wordpress показывал посты для всех языков (Polylang)?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    У Polylang, при всей моей любви к этому плагину, есть несколько недостатков, вызванных архитектурой WP. И это - один из этих недостатков. К счастью, один наш земляк это решил - попробуйте плагин Language Mix.

    Кроме этого, в документации Polylang есть вот такая полезная штука: How to display the default language post if the tr...
    Ответ написан
    Комментировать
  • Как для Wordpress MU узнать, авторизован ли пользователь на другом подсайте?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Вообще, если в wp-config.php константу домена куки прописать пустой, то авторизация по умолчанию будет работать так как надо, до тех пор пока подсайты являются поддоменами основного домена (без использования маппинга других доменных имен). Авторизовавшись на любом из сайтов сети пользователь остается авторизован на любом другом сайте сети, включая главный сайт. По умолчанию в куку прописывается тот домен/поддомен, на котором пользователь авторизовася, поэтому авторизация слетает на другом сайте сети.
    Ответ написан
    Комментировать
  • Как использовать свою БД?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    WordPress позволяет использовать стороннюю таблицу wp_users, но тогда надо класс WP_Users переписать под свою структуру и данные (наследовать или заменить). Можно сделать свой oAuth сервер, один общий на все ресурсы - сайт, форум, WP. Во избежание дополнительных танцев с бубном над форумом я бы использовал BBPress - движок форума на базе WordPress. Он будет использовать тот же механизм юзеров, что и WP, а значит работы меньше.
    Ответ написан
    Комментировать
  • Существует ли плагин которые создает папки в медиафайлах вордпресса ?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    А зачем? По ходу вы вообще не представляете как работает система медиафайлов у WordPress. Каждый медиафайл - это запись (пост типа 'attachment') в бд. Для каталогизации есть плагины, добавляющие теги/рубрики для медиафайлов. Какая вам вообще разница, как оно на сервере по папочкам растыкано? Чем не подходит способ кучей загрузить их через медиа-загрузчик?
    Ответ написан
    6 комментариев
  • Wordpress отрезает UTM метки. Как исправить?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Вполне возможно, что происходит редирект (301/302), поэтому теряются метки. Проверить можно в Firebug / Chrome Dev Tools. В RewriteRule что-то подобное этому [NC,QSA,R=301,L] должно помочь (я с Апачем давно не работаю, поэтому нужно пробовать).

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

    И еще есть нюанс - WordPress не очень любит любые _GET параметры, кроме зарегистрированных с помощью add_query_var(). Но не думаю, что проблема в этом - отрезать он их не должен.
    Ответ написан
  • Как вы верстаете Wordpress темы?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Использование _s - очень правильная идея. Верстка сначала в html - очень неправильная, разве что есть уже свой собственный базовый код, основанный на WordPress. Почему? Потому что WordPress генерит везде кучу своих CSS-классов, и правильно использовать именно их.

    Процесс такой:
    - идея, эскизы на бумаге, продумывание особенностей, модульные сетки, прототип
    - дизайн в фотошопе
    - сборка функциональной части шаблона - подключение нужных плагинов, вывод метаполей, весь кастомный вывод - в общем, необходимо вывести в шаблон (_s) весь реальный контент (или приближенный к реальному), а не верстать с Lorem Ipsum
    - а вот теперь самое интересное - SCSS, mobile first + javascript. В общем, чистый frontend.
    Ответ написан
    4 комментария
  • Как перевести произвольные строчки с помощью Polylang?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    У Polylang есть свои собственные маленькие функции, полезные для таких целей. Конкретно в этом случае, есть 3 варианта:

    1. Локализация строки обычным методом WordPRess - в шаблоне находим где этот текст и оборачиваем его в функцию _e() или __(). После этого делаем перевод строки в POedit, Как обычно.

    2. Локализация строки точно так же, как в п.1, только вместо внешнего POedit ставим плагин Loco Translate и переводим строку прямо в админке.

    3. Вместо функций _e() или __() используем функции pll__(), pll_e() вместе с pll_register_string() и переводим в админке WordPress на странице настроек Polylang. Документация.

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

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    WordPress использует обе ссылки, так как контент должен быть по логике доступен и так, и так. Урл разные, контент дублирующий. С точки зрения SEO решается с использованием rel="canonical", если надо что-то дополнительно делать - есть разные варианты. Тут интересное обсуждение (англ), возможно поможет.

    Не совсем понятно что означает "задать приоритет рубрик". Что конкретно надо сделать?
    Ответ написан
    Комментировать
  • Wordpress 4. Как сделать многоуровневую структуру содержимого?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Использовать соответствующие шаблоны. Читаем Иерархия шаблонов. Берем archive.php и копируем его в taxonomy-{taxonomy_slugname}.php.
    Ответ написан
    Комментировать
  • Как выполнить функцию после сабмита формы?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Код и не мог работать на странице формы, WordPress не позволит. Почитай про lifecycle. Хукаться и выполнять другие низкоуровневые действия можно только из functions.php или из плагина. Непосредственно из файла темы (шаблона) работать не будет, если на пальцах - в тот момент, когда инклудится и выполняется файл темы, все основные экшны уже давно выстрелили.
    Ответ написан
    Комментировать
  • Правильно ли организована моя лента для Wordpress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Внимательно читайте документацию и best practices в блогах опытных разработчиков. На русском языке действительно качественной информации по WordPress очень мало. Читайте хотя бы Константина Ковшенина (блог на английском, блог на русском).

    1. Никогда не используйте query_posts. Это неэффективно - данная функция заменяет основной запрос (Main Query), но выполняется ПОСЛЕ него. То есть, выполняет запрос к БД повторно, уже с новыми аргументами. Кроме того, практически гарантированно вылезут проблемы с постраничной навигацией. И не забывайте, что все дополнительные данные (виджеты с категориями, последними постами и комментами и т.д.) будут продолжать пытаться использовать данные из основного запроса, а данная функция глобальные переменные заменит, большая часть template tags будет выдавать совершенно неожиданные вещи. Бардак обеспечен. При использовании этой функции нужно не забывать в нужных местах вставлять wp_reset_query(), с чем точно запутаетесь. Данную функцию можно использовать только в одном случае - вызывать ДО основного loop, чтобы изменить параметры запроса. В этом случае WordPress проигнорирует те параметры, которые получит в запросе (GET / ваш урл), и будет использовать те, которые ему передать через query_posts. Но для этих задач есть более правильные решения.

    2. Функция get_posts() предназначена для получения небольших, конкретных списков постов мимо основного Loop. Когда не нужна постраничная навигация и все дополнительное добро. Например, под статьей вывести список 5 последних статей из этого раздела. Или в боковой колонке вывести 10 статей, помеченных тем же тегом, что основная статья.

    3. Если КРОМЕ основного запроса нужно сделать еще один, используйте новый loop:

    $myquery = new WP_Query( $args );
    if( $myquery->have_posts() ) :
        while( $myquery->have_posts() ) : $myquery->the_post();
        ...
        endwhile;
    endif;

    Например, есть раздел "События", и этот раздел - не обычные posts, а custom post type 'event'. И нам в ленте надо вывести не в обычном виде, а 2 блока - первый это ближайшие события (по дате от сегодня и в будущее), второй - прошедшие события (по дате от сегодня и в прошлое). Первый блок выводим модифицированным основным запросом (см. дальше про модификацию основного запроса), второй - нашим новым лупом.

    3. Если нужно модифицировать основной запрос, и все что с ним связано (глобальные переменные и т.д.), единственно правильный способ - через хук pre_get_posts. Использовать надо в файле functions.php

    add_action( 'pre_get_posts', 'my_function' );
    function my_function( $query ) {
        // здесь можно (и нужно) использовать conditional проверки 
        // и модифицировать запросы для разных страниц и исловий, 
        // все в одной фукнции.
        if( $query->is_archive() && $query->is_main_query() ) :
            $query->set(
                'tag_id'                  => '1,10,15,2,30,31,32,35,89,55,120,140,150,4',
    	    'author'                 => '1,2,3,50,150,140,35',
    	    'posts_per_page'   => '10',
    	    'orderby'                => 'date',
            );
        endif;
    }

    Данный способ не плодит дополнительных запросов, модифицирует напрямую основной запрос, при этом остается возможность модифицировать его дополнителньо из других мест (например, из плагинов - тот же WPML или Polylang для мультиязычной подддержки), не вызывает никаких проблем с постраничной навигацией, правильно устанавливает все глобальные переменные, отчего все дополнительные плюшки (виджеты, последние комменты и посты, меню и прочее) работают корректно.
    Ответ написан
  • Как лучше сделать связь записей в CMS WordPress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Advanced Custom Fields штука хорошая и удобная, но на больших сайтах со сложным контентом - жутко медленная. Если нужны именно кросс-связи между объектами (post types, users) - есть отличный плагин Posts-to-Posts. Ну и кастомные таксономии.

    Грубо говоря, логика такая:
    - все что похоже на самостоятельный объект со своей моделью -> custom post type
    - любые "поля" / даполнительные данные, по которым нужна агрегация, сортировка, фильтрация и тд -> custom taxonomy
    - любые поля, которые просто дают доп.инфу -> custom meta (postmeta, usermeta и т.д.)
    - у ACF у полей Relationship есть галочка "Загрузить значение основываясь на терминах записи и обновить термины записи при сохранении" - обязательно использовать ее
    - если нужно связать объекты напрямую - Posts-to-Posts.

    Например, есть событие (CPT), есть место/локация (CPT), есть пользователи. Есть таксономии страна/город, тип события. С помощью Posts-to-Posts связываем между собой событие и место, а также к событию привязываем несколько пользователей (например, организаторы события), и у события и у места есть таксономия страна/город. Таксономия тип события релевантна только для событий. Получается стройная и гибкая, расширяемая схема. И главное - это все быстро работает, никаких запросов по meta_key. А место ACF в этой схеме - например, для локации это адрес, карта, контакты, ссылка на сайт/соцсети, фотогалерея и тд. Для события - приглашение, расписание, фотографии и видео, дата и время проведения события и тд.

    Я описал на своем примере, но переложить логику на компании / лица не составит труда.
    Ответ написан
    Комментировать
  • Как отправить id товара через плагин в wordpress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Описание весьма запутанное. Ряд товаров на одной странице выводится как? Custom loop? Тогда получить ID товара можно через $post->ID (если это измененный главный запрос/луп, он же main query), или через $myloop->ID, где $myloop - переменная, содержащая кастомный объект WP_Query (автономный луп). Если проблема в том, что шорткод ожидает одно название переменной, а его на момент рендера шорткода не существует, тогда попросту задавайте эту переменную передвызовом, присваивая ей значение, полученное из объекта WP_Query (см. Выше).
    Ответ написан