Ответы пользователя по тегу WordPress
  • Как вывести в Wordpress кнопки с ссылками на страницы использующие определенный шаблон?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Используемый шаблон (файл, не его название) записывается в wp_postmeta, получить можно с помощью meta_query:
    $args = [
        'post_type' => 'page',
        'posts_per_page' => 100,
        // 'post__not_in' => [ get_the_ID() ], // Раскомментируйте, если хотите исключить текущую страницу
        'meta_query' => [
            [
                'key' => '_wp_page_template',
                'value' => 'custom-template.php'
            ]
        ]
    ];
    $my_pages = new WP_Query( $args );
    
    if ( $my_pages->have_posts() ) :
        while ( $my_pages->have_posts() ) : $my_pages->the_post();
            the_title( '<h3>', '</h3>' );
        endwhile;
    endif;
    
    wp_reset_postdata();
    Ответ написан
  • Как лучше делать пагинацию при натяжке на WordPress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Пагинация в WordPress уже встроена из коробки, даже 2, с гибкими настройками. Первая - простая "вперед / назад", вторая - с настраиваемыми номерами страниц и тд.

    Ну а внешний вид (дизайн) с помощью CSS делаем.
    Ответ написан
    1 комментарий
  • Как создавать автоматические посты в WordPress из ленты Twitter?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    1. Создаете свой плагин.
    2. Подключаете в нем Twitter SDK на удобном для вас языке (в случае с WP скорее всего это будет JavaScript или PHP).
    3. Пишете логику для проверки обновлений в ленте твиттер аккаунта.
    4. Пишете логику для получения контента индивидуального твита и сохранения в виде записи в WordPress.
    5. Создаете фоновую задачу, которая проверяет обновления в ленте (№3) если обновление обнаружено - получает контент и сохраняет (№4).
    6. Профит!
    Ответ написан
  • Сложный вопрос. Как сделать автоматический выбор рубрик с других таксономий?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Вам нужно 2 таксономии - города и типы (впрочем, и типы можно было бы дробить на отдельные таксономии, но это уже надо смотреть ТЗ и вникать, возможно на долгосрочную перспективу это имело бы смысл, возможно нет). Каждой записи вы назначаете термины отдельно друг от друга. Каждая запись должна иметь термин "город" (Киев, Москва и тд) и термины типа - один первого уровня (Рестораны, Спорт) и один или несколько второго уровня (например TRX, сквош и тренажерка в одном и том же спорткомплексе). Со структурой разобрались?

    Обратите внимание, дерево терминов "Рестораны, Спорт и тд" не под "Москва" должны быть, как у вас. Это должны быть независимые таксономии, они между собой никак не связаны. Запись получает независимо термин(ы) из одной и другой. Только запись знает о 2х таксономиях, сами таксономии друг о друге знать не должны и связи между ними быть не должно.

    С таким (правильным с точки зрения архитектуры) подходом ваш вопрос теряет смысл.
    Ответ написан
    1 комментарий
  • Как отфильтровать записи по меткам wordpress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    как мне получить метку по которой был осуществлен переход?

    get_queried_object()?

    On a category archive, tag archive, or other taxonomy archive page, it will return the WP_Term object of the current category, tag, or other term.
    Ответ написан
    2 комментария
  • Как перейти от ACF PRO на Gutenberg?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    ACF Pro помогает создавать блоки для Gutenberg с помощью PHP, это удобно и значительно ускоряет работу. Но если надо полностью отказаться от ACF Pro и использовать только Gutenberg, то придется запилить свои блоки (привет React) или же найти готовые, подходящие под ваши задачи.

    Впрочем, по некоторым блокам стоит выдохнуть и немного подумать - возможно стоит изменить свое мышление. К примеру, на ACF мы повторяющийся контент автоматом считаем рипитером и создаем соответствующие поля. А на Gutenberg часто repeater как таковой и не нужен - достаточно самого блока. Ведь создать несколько одинаковых блоков подряд в Gutenberg не составляет труда, это как бы встроено из коробки.

    Простой пример - блок testimonials. На ACF мы создаем обычно рипитер, в нем нужные поля которые будут повторяться, скажем - text, name, photo (текст отзыва, имя клиента и его аватар). А на gutenberg достаточно иметь блок testimonial с этими же полями, и просто вставить его X раз подряд - вот вам и повторяющиеся данные.
    Ответ написан
    Комментировать
  • Как задать класс изображениям внутри записи на Wordpress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Самый простой способ - на хуке the_content обычной заменой или регуляркой, но это если у картинок всегда одна структура (например, мы точно знаем что тег будет <img src="..." class="..." ...). Но вообще парсить html регулярками не самая светлая мысль - для этого есть DOMDocument:
    function add_class_to_images( $content )
    {
        $document = new DOMDocument();
        libxml_use_internal_errors(true); // чтобы не ругался на семантические HTML5 теги
        $document->loadHTML( $content );
        libxml_clear_errors();
    
        $images = $document->getElementsByTagName( 'img' );
    
        /** @var \DOMElement $image */
        foreach ( $images as $image ) {
            $image->setAttribute( 
                'class', 
                $image->getAttribute( 'class' ) . ' my-new-class'
            );
        }
    
        return $document->saveHTML();
    }
    add_filter( 'the_content', 'add_class_to_images' );
    Ответ написан
    9 комментариев
  • Как уменьшить запасы товаров в woocommerce при статусе "pending"?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Так, а давайте для начала определим, почему у вас заказы попадают в статусе pending?

    Потому что pending - это промежуточный, "технический" статус между созданием заказа и его оплатой с последующим переходом в статус processing (в случае успешной оплаты) или failed (в случае ошибки с оплатой или отказа).

    Методы оплаты с "отложенной оплатой" (банковский перевод, наличкой/наложенным при получении) могут использовать статус on-hold - если оплату нужно подтверждать (заказ не начнет выполняться пока не будет подтверждения платежа), или сразу processing, если подтверждение не требуется (наличкой при получении). И processing, и on-hold уменьшают сток, потому что это как раз статусы, с которыми вам и надо работать - они для этого и созданы. А pending - это немножко про другое.

    Подробнее: https://docs.woocommerce.com/document/managing-ord...
    Ответ написан
    Комментировать
  • Почему пишет, что путь не правильный?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Всегда используйте абсолютные пути. Всегда. И не будет таких вопросов.
    // require '../template/items-work.php';
    require get_template_directory() . '/template/items-work.php';
    Ответ написан
    Комментировать
  • Как очистить ключ от пробелов в meta_query?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Вам поможет array_map, чтобы применить определенное действие к каждому элементу массива, и preg_replace с простенькой регуляркой, который удалит все whitespace-символы.

    <?php
    // Входящие данные
    $values = [2500, '2 999'];
    
    // Очистка от пробелов
    $values = array_map(static function($value) {
        return preg_replace('/\s/', '', $value);
    }, $values);
    
    // Запрос
    $recent2 = new WP_Query(
        [
            'showposts' => 100, // Не используйте -1, используйте достаточно большое для ваших задач число
            'meta_query' => [
                [
                    'key' => 'cena', // Не называйте данные транслитом, используйтe price
                    'value' => $values,
                    'compare' => 'BETWEEN'
                ]
            ]
        ]
    );
    Ответ написан
  • Как правильно создать ajax-тему Wordpress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    REST API + роутинг на фронтенде
    Ответ написан
  • Как синхронизировать данные двух таблиц wp_users и wp_2_users?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Готов поставить ящик пива, что ваша задача решается немного другим путем. Смотрите мой ответ в другом вашем вопросе: Как сделать регистрацию на wordpress в две таблицы?
    Ответ написан
    Комментировать
  • Как сделать регистрацию на wordpress в две таблицы?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Я бы вам советовал подойти к задаче с другой стороны. На самом деле пользователи должны создаваться в одной таблице, точнее в одной паре таблиц (wp_users и wp_usermeta), и храниться в единственном экземпляре. А на втором сайте вы просто указываете, что надо использовать эту пару таблиц от первого сайта. Для этого в wp-config.php есть 2 конфигурационные константы:
    define( 'CUSTOM_USER_TABLE', $table_prefix.'my_users' );
    define( 'CUSTOM_USER_META_TABLE', $table_prefix.'my_usermeta' );

    Подробнее тут.
    Ответ написан
  • Как решить проблему с 404 ошибкой при изменении количества товаров на страницу WooCommerce?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Если там при выборе количества записей на страницу просто добавляется параметр ?prod-count=5 к текущему URL и браузер отправляется по этому новому URL, то проще всего повесить обработчик этого get-запроса где-нибудь на template_redirect. Смотрите, есть ли GET-параметр prod-count, если да - смотрите на какой вы странице, сколько всего результатов у WC_Product_Query, сколько выводить просит prod-count. Считаете, и если получается что страница Х у вас не будет существовать - редиректите на нужную.
    Ответ написан
    7 комментариев
  • Почему не создаются посты без перезагрузки?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Вы не поняли как работает ajax. Данные вы отправили, пост создался. Но чтобы на странице/страницах, которые УЖЕ загружены в браузере увидеть обновления, нужно либо вручную их обновить, либо из полученного по аякс ответа сгенерировать нужный html и вставить его в эти страницы (сможете только в ту из которой инициировали загрузку). Если же вы хотите в других вкладках чтобы открытые страницы сами обновлялись когда на бекенде новые данные появились, то вам нужны другие технологии. Читайте про веб-сокеты.
    Ответ написан
    1 комментарий
  • Как выявить нагрузку на CPU в index.php Wordpress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Дело в том, что index.php это входная точка, там всего пару строк кода. Это не один изолированный скрипт со всеми фичами, который вы можете как-то отдебажить. Он поднимает все ядро WP, там тысячи других файлов. Для отладки используется профилирование кода - Xdebug, XHProf, Tideways, Blackfire. На shared хостинге разумеется этого всего не будет.
    Ответ написан
    Комментировать
  • Зачем писать url: admin-ajax.php?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Ваш js отправляет данные на файл-обработчик, который является входной точкой. Воспринимайте его как API endpoint. Потому что отправить запрос на файл functions.php вы не сможете, это include. А вот /wp-admin/admin-ajax.php - это не include, там поднимается слегка облегченная версия всего WordPress которая рассчитана исключительно на то, чтобы принять ваши отправленные данные, определить какой action вы хотите использовать и через этот action передать полученные данные на обработчик, который висит на этом экшне. И вот уже в functions.php вы на этот экшн в формате wp_ajax_{$action} и wp_ajax_nopriv_{$action} подключаете свой обработчик, который примет отправленные данные, сделает с ними все что нужно и вернет ответ, который в свою очередь /wp-admin/admin-ajax.php вернет обратно вашему js.

    По ссылке Пычев Анатолий более подробно с примерами. А вообще откройте в редакторе сам файл /wp-admin/admin-ajax.php и часть вопросов сама отпадет.
    Ответ написан
  • Как скрыть таксономии при добавлении поста?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Вам погомут conditional rules.

    Создайте одно поле с выбором таксономий (городов). Это может быть поле типа select, radio, checkbox - зависит от того нужно ли вам выбирать один или несколько городов. В значения этого поля добавьте все ваши города/таксономии. Можно это сделать вручную, а можно программно заполнить из существующих таксономий.

    Дальше под каждую таксономию (город) создайте свое поле типа Taxonomy, в котором и будут выбираться термины. Включите в этом поле галочки Create Terms, Save Terms и Load Terms, а также включите Conditional Logic - именно в этом вся магия. Теперь в conditional настройте условие. Вот так это выглядит:

    5e9820dca3b3f788190769.jpeg

    А вот так это выглядит на странице редактирования записи - по умолчанию город не выбран:

    5e9820f420767468763297.jpeg

    А если выбрали город - показало поле для выбора категории в этом городе:

    5e9821140e5ab394583256.jpeg

    Вот вам экспорт этой тестовой группы полей, имопртните себе в ACF и поковыряйте:

    [
        {
            "key": "group_5e981df6cbdcc",
            "title": "Taxonomies",
            "fields": [
                {
                    "key": "field_5e981e4bb1454",
                    "label": "City",
                    "name": "taxonomy",
                    "type": "checkbox",
                    "choices": {
                        "spb": "SPB",
                        "msk": "Moscow",
                        "omsk": "Omsk"
                    },
                    "layout": "vertical",
                    "return_format": "value",
                },
                {
                    "key": "field_5e981e18b1453",
                    "label": "MSK",
                    "name": "term",
                    "type": "taxonomy",
                    "conditional_logic": [
                        [
                            {
                                "field": "field_5e981e4bb1454",
                                "operator": "==",
                                "value": "msk"
                            }
                        ]
                    ],
                    "taxonomy": "post_tag",
                    "field_type": "checkbox",
                    "add_term": 1,
                    "save_terms": 1,
                    "load_terms": 1,
                    "return_format": "id",
                    "multiple": 0,
                    "allow_null": 0
                }
            ],
            "location": [
                [
                    {
                        "param": "post_type",
                        "operator": "==",
                        "value": "post"
                    }
                ]
            ],
            "menu_order": 0,
            "position": "side",
            "style": "default",
            "label_placement": "top",
            "instruction_placement": "label",
            "active": true,
        }
    ]
    Ответ написан
    2 комментария
  • MustHave плагины для wordpress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Давайте для начала определим вашу роль и ваши цели.

    Если ваша роль - разработчик, то must-have плагинами будут те, которые облегчат вашу работу - Advanced Custom Fields (желательно Pro), Query Monitor, Laps и тд, или же малой кровью решать типовые задачи - Classic Editor, Disable Comments, Safe SVG, Enable Media Replace и подобные. Под "малой кровью" имеется в виду что они имеют минимальный overhead, не делают ничего лишнего и вы сами лучше все равно не напишете. Все остальное пишем сами, форкаем у других разработчиков, тюним под свои задачи и тд - со временем накапливаем собственный инструментарий.

    Если ваша роль - имплементатор (собираете сайтики на WP, но в PHP не умеете), то набор плагинов будет другим. Тут уж коллеги-имплементаторы подскажут какие плагины важны, какие нужны.

    Если ваша роль - владелец сайта, который все сам хочет делать - это ближе к имплементаторам.

    Если ваша роль - контент пилить, а все остальное вторично - просто выбирайте плагины под нужную функциональность и старайтесь всегда в голове держать простое умозаключение - чем плагин навороченнее (больше фич, больше настроек, больше страниц в админке и тд), тем он как правило медленнее. Чем бoльше таких плагинов - тем медленнее сайт. Поэтому стараемся ставить только то, что абсолютно необходимо и из доступных вариантов на фичу выбираем тот, который наиболее легковесный. В идеале - тестируем несколько штук и выбираем один.

    Теперь по целям. Чего вы хотите? Чтобы можно было быстро собрать сайт для тестирования бизнес идеи с минимальными расходами? Это одна кухня. Чтобы был легкий и быстрый контент-сайт, который выдерживает серьезный трафик? Это другая кухня. Интернет-магазин? Вообще другое. А в какой нише этот интернет-магазин? Физические товары или цифровые? А рынок местный или международный? Это все будет вас приводить к разному набору плагинов. Думаю, смысл уже понятен.
    Ответ написан
    2 комментария