• Как добавить в цикл название выбранного категории?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Так строчкой выше же: get_queried_object()->name;
    Ответ написан
  • Страницу Произольного Типа Записи для для кастомных ролей нужно добавлять отдельно?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    У вас при регистрации custom post type стоит 'capability_type' => 'page',. Это генерит capabilities вида "edit_pages", "publish_pages" и тд. А при создании роли вы указали "edit_posts", "publish_posts". Capabilities разные.

    И вообще, если уж регистрировать custom post type с мыслью о дальнейшем контроле доступа, то генерите свои произвольные capabilities, в данном примере это будет "'capability_type' => 'estate',", далее назначайте эти capabilities нужным ролям. Почитайте еще про map_meta_cap.

    Именно ролями с корректно выставленными capabilities можно контролировать что юзер может делать в админке, а что нет. С помощью remove_menu_page( 'plugins.php' ); вы только убираете ссылку из меню, сама страница остается и она доступна. Зайдя по ее прямому адресу пользователь все равно сможет админить плагины. Огромная дырка тут у вас :) В документации же черным по белому написано:

    Please be aware that this would not prevent a user from accessing these screens directly. Removing a menu does not replace the need to filter a user's permissions as appropriate.


    Правильный способ закрыть юзеру доступ к определенным фичам - убрать у него соответствующую capability, в случае с плагинами это будет:

    - activate_plugins
    - delete_plugins
    - edit_plugins
    - install_plugins
    - update_plugins

    Полный список ролей и их capabilities есть в документации.

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

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Ответ написан
    Комментировать
  • Как скрыть уведомления о обновлении WordPress 4.9.8?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Проще простого. Просто фильтруем соответствующие wp_options, говорим движку что обновлений нет. От версии WP вообще никак не зависит.
    add_action( 'after_setup_theme', function() {
    	add_filter( 'pre_option_update_core', '__return_null' );
    	add_filter( 'pre_site_transient_update_core', '__return_null' );
    } );
    Ответ написан
    1 комментарий
  • Как создать второй "single.php" в WP?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Шаблон: single-{post-type}.php
    Conditional tag: is_singular( 'post-type' );

    У the_permalink() нету таких функций.

    Каких "таких функций"? Эта функция получает объект WP_Post $post и собирает правильную ссылку.
    Ответ написан
    1 комментарий
  • Стырить тему для wordpress без указания автора?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Изучите что такое лицензия GPL и все вопросы у вас отпадут.
    Ответ написан
    Комментировать
  • Исключить дочерние комментарии wp?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Добавьте в массив $args параметр 'parent' со значением 0 (то есть, комментарии верхнего уровня):
    $args = array(
        'number' => 6,
        'orderby' => 'comment_date',
        'order' => 'DESC',
        'status' => 'approve',
        'type' => 'comment',
        'parent' => 0,
    );
    Ответ написан
    1 комментарий
  • Использование API погоды?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Используйте wp_remote_get() или wp_remote_post() для получения данных от АПИ + Transients для кеширования ответов.
    Ответ написан
  • Как разбить запись на подзаписи с другим дизайном?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Вариантов много. Либо шаблоны page-{id}.php / page-{name}.php, либо произвольные templates, которые назначаются вручную каждой конкретной странице. Если "страницы" это не page, а custom post type, то при регистрации нужно в 'supports' указать 'page-attributes'.
    Ответ написан
    Комментировать
  • Как создать партнерскую ссылку wordpress через php?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Реферальный ID передается единожды через $_GET, прикрепляясь в виде параметра к любому URL сайта. На хуке init вешается обработчик, который его ловит и пишет в куки. Дополнительно можно проверять на наличие реферального ID в куках и либо продлять время жизни, либо перезаписывать / игнорировать (если в куках сохранен другой ID - чтобы не засчитался реферал сразу нескольким юзерам).

    Сам ID генерится как уникальный хеш - на основе например user_id + user_email. Хранится либо в отдельной таблице в базе данных (id | user_id | affiliate_id), либо в wp_usermeta, если пользователей не очень много и заметного влияния на скорость при выборках / поиске юзера по реферальному ID не будет.

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

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Если это ACF, то the_field( 'название_поля', $other_post_id ); - где $other_post_id - ID записи, к которой это поле привязано.
    Ответ написан
  • Как сделать вывод записей через фильтр?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Для начала вам надо ТЗ написать - что из ваших "критериев" является чем - где это таксономия, где метаданные (и какого типа в контексте meta_compare - числовые, строка, дата) и тд. Потом переосмыслить (и возможно переписать) все это. Для группировки использовать именно таксономии. Метаданные для второстепенного (по ним желательно выбирать-сортировать только в крайнем случае).

    Сами фильтры делаются достаточно просто - собираете в форме фильтра все установленные параметры поиска и передаете их в WP_Query, который выводит записи в виде $args. Если это основной запрос (Main Query) - передаете через хук pre_get_posts.
    Ответ написан
    Комментировать
  • Как сделать кастомный чпу из site.ru/client/userid=1 в wordpress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Подробнее опишите саму суть задачи и вашу текущую архитектуру данных. Сейчас это звучит как дичь и костыли. Подозреваю, что clients вам надо делать как custom post type.
    Ответ написан
    1 комментарий
  • В чем заключается работа wordpress php разработчика с опытом?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Есть имплементаторы, которые собирают сайты из готовых плагинов / тем. Это ваша студия.
    Есть разработчики, которые эти самые плагины и темы разрабатывают. Это, по идее, вы.

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

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Родного фильтра в WordPress для таких задач не существует. Можно решить через output buffering. Для этого создайте mu-plugin (он гарантированно будет выполняться до темы), в котором включите буферизацию и зарегистрируйте свой фильтр. Например, файл wp-content/mu-plugins/html_filter.php:
    <?php
    // Включаем буферизацию.
    ob_start();
    
    // Регистриуем свой фильтр на хуке shutdown, он выполняется в конце цикла работы WP, страница на этот момент сгенерирована.
    add_action( 'shutdown', function() {
        $html = '';
    
        // Уровней буферизации может быть больше одного нашего, мы должны взять все:
        while( ob_get_level() ) {
            $html .= ob_get_clean();
        }
    
        // А теперь пропускаем финальный вывод через свой кастомный фильтр:
        echo apply_filters( 'filter_html', $html );
    }, 0);

    А теперь можем хукаться в наш фильтр:
    add_filter( 'filter_html', function( $output ) {
        return str_replace( 'foo', 'bar', $output );
    });

    Писал с головы, без тестирования. Могут быть нюансы, но в целом смысл должен быть понятен.
    Ответ написан
    Комментировать
  • Сохранять комментарий названия темы в style.css в WordPpress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    WordPress использует заголовки style.css в строго определенном формате для того, чтобы определить саму тему. Воспринимайте их как конфиг, файл конфигурации и оставьте их в покое. Чем они вам мешают? Несколькими байтами кода?
    Ответ написан
  • Конфликт двух Custom Post Type - Как исправить?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Ох там и винегрет)) при чем у каждого register_post_type свои приколы, например:
    - 'query_var' => 'post_type', - это во втором куске
    - $rewrite - в первом нет, во втором есть
    - 'exclude_from_search' => true, - вангую, что объекты недвижимости таки должны искаться
    - 'capability_type' => 'page', - вангую, что тут редактора с разными ролями могут быть, импорт и тд, а значит capability свои надо генерить а не наследовать от page
    - 'taxonomies'  => array( 'estate_type', 'estate_operation', 'estate_district', 'estate_building_type', 'estate_class'),
    - вот этого лучше вообще не делать, этот аргумент для встроенных таксономий подходит, для кастомных - не очень. Там порядок регистрации и связки таксономий и типов записей немножко не такой, как вы думаете. Связку делайте через таксономии - регистируя их, указывайте для каких post_type.

    Ну и много такого. Воспользуйтесь GenerateWP -> Post Type Generator и создайте ваши custom post types по одной и той же схеме, как положено. Таксономии можете пересоздать там же. Глядишь, и баги уйдут.

    ЗЫ: А вообще если у вас в проекте их много (таксономий и типов записей), то пора переходить на новый уровень - использовать библиотеки.
    Ответ написан
    Комментировать
  • Как передается информация о пользователе в WordPress AJAX?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Авторизованный юзер - это кука у юзера на клиенте и сессия на сервере у вас. При всех запросах браузер автоматически передает куку на сервер, по ней идентифицируется сессия пользователя. Если сессия есть и она валидная, юзер считается авторизованным. Ну и все его данные доступны - ID, роль, permissions и тд. Поскольку при аякс-запросе выполняется не только 1 эта функция-коллбек, а сначала загружается и выполняется ядро WordPress, то функция is_user_logged_in() на момент ее вызова в коллбеке уже работает в нормальном окружении WP, имеет доступ к сессии, данным юзера и тд. Вот и вся магия.
    Ответ написан
    1 комментарий
  • Сколько раз можно использовать тег aside и есть ли в этом практическая составляющая?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Вот тут посмотрите:
    https://developer.mozilla.org/en-US/docs/Web/HTML/...

    И вы немного недопоняли семантику. Вроде и поняли, но есть нюансы:

    aside описывает косвенный контент, который не имеет прямого отношения к основному содержимому,

    Aside описывает контент, который имеет отношение к основному содержимому, но является дополняющим, не основным контентом. Использовать его можно ровно столько раз, сколько нужно.

    например реклама, счетчики, облако тегов, слайдеры и т.д.

    А вот счетчики, реклама как раз не имеет никакого отношения к основному контенту и не должно быть в aside. Облако тегов, имхо, логичнее делать в footer внутри article. Слайдер - это скорее section внутри article. Возможно, figure (но скорее нет, логичнее section).
    Ответ написан
    8 комментариев
  • Как отсортировать выборку (WP_Query) по произвольному полю, предварительно обработав его значение?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Если вам надо производить такие вычисления, то у вас архитектурно неправильно реализовано. Такие данные нужно хранить не в postmeta, а в отдельной таблице. Структура, грубо (назовем таблицу post_ratings):
    id  |  post_id  |  user_id  |  rating
    -------------------------------------
    1   |  189      |  34       |  4

    Именно по этой таблице делаете начальную выборку с просчетом среднего рейтинга и сортировкой, на выходе получаете список post_id. Их потом передаете в WP_Query через параметр post__in.

    Как вариант, можно "кешировать" средний, уже просчитанный, рейтинг в таблице postmeta, в виде одного int. Пересчитывать его либо каждый раз при добавлении новой записи в кастомную таблицу (запросом или отправкой в очередь), либо кроном раз в какое-то время.
    Ответ написан
    Комментировать