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

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Берите код, который для записей, только там где 'post_type' = > 'post' меняйте на 'post_type' => 'page'.
    Ответ написан
  • Сортировка по кастомному полю WordPress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    1. У WP_Query нет и никогда не было аргумента 'hide_empty'. Этот аргумент у таксономий встречается, в WP_Term_Query. Соответственно, его значения true или false никакого эффекта не дадут, он игнорируется. Уберите его.
    2. 'meta_key' => 'sort' инструктирует WP_Query в первую очередь выбрать записи, у которых данное мета-поле есть.
    Сортировка происходит (условно) после выборки, сортируются те результаты, которые соответствуют условиям выборки, в данном случае это записи у которых мета-поле sort существует.
    3. Попробуйте вот так:
    $args = [
    	'meta_query' => [
    		'relation' => 'AND',
    		'meta_exists_clause' => [
    			'key'     => 'sort',
    			'compare' => 'EXISTS',
    		],
    		'meta_value_clause' => [
    			'key'  => 'sort',
    			'type' => 'numeric',
    		],
    	],
    	'orderby' => [
    		'meta_exists_clause' => 'ASC',
    		'meta_value_clause'  => 'DESC',
    	],
    ];
    Ответ написан
    1 комментарий
  • Как написать консольный php скрипт для wordpress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Включение wp-load.php в принципе и есть способом подключения WP. Но в случае с командной строкой есть нюансы - надо конечно смотреть ваши фаталы (поделитесь инфой из error.log), высока вероятность того, что он ругается на отсутствие некоторых переменных окружения - элементов массива $_SERVER например.

    Если вам нужно полноценно работать в CLI - используйте WP-CLI, пишите свои пакеты под него. Если какие-то простые задачи - вешайте через WP Cron API.
    Ответ написан
    2 комментария
  • Как в WP разрешить чтение постов с другим статусом?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Плагин не плагин, а регистрируется post_status в конечном итоге с помощью функции register_post_status. Как и многие другие функции WP, она принимает ряд аргументов, в том числе такие:

    public
    (bool) (optional) Whether posts of this status should be shown in the front end of the site.
    Default: false

    internal
    (bool) (optional) Whether the status is for internal use only.
    Default: false

    private
    (bool) (optional) Whether the posts of this status should be accessible by their urls.
    Default: false


    Эти аргументы определяют, будет ли доступен данный статус на фронтенде и будут ли генерироваться ЧПУ. Скорее всего плагин конфигурирует их как приватные, поэтому они недоступны. Есть 3 варианта (возможных):

    1. В самом плагине есть возможность перенастроить эти свойства под себя.
    2. Плагин предоставляет фильтр, с помощью которого можно изменить эти аргументы.
    3. Менять эти аргументы напрямую в определении статусов, через глобальный доступ (фильтрами тут WordPress, увы, не радует):

    function make_archived_status_public()
    {
    	global $wp_post_statuses;
    
    	// Меняем public на true
    	$wp_post_statuses['archived']->public = true;
    
    	// Повторяем для других аргументов, если нужно
    	// ...
    }
    add_action( 'init', 'make_archived_status_public' );
    Ответ написан
    8 комментариев
  • Почему не работают функции WP?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    А как вы вызываете шаблон/страницу? По какому УРЛ открываете? Потому что у вас PHP ругается на первую же вордпрессовскую функцию в коде. Любую, которая попадается первой. Это говорит о том, что именно вордпрессовские функции не загружены, то есть вы исполняете файл темлпейта вне окружения WordPress. А это, вероятнее всего, потому что вы что-то делаете не так.
    Ответ написан
    Комментировать
  • Как вывести все дочерние страницы определенной страницы wordpress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Оденьте трусы или снимите крестик.

    Вы или начните читать документацию WordPress, разберитесь с тем, что такое WP_Query, Custom Post Types, Custom Taxonomies, Rewrite Rules, $query_vars, как WordPress обрабатывает запрос от начала до конца и тд, либо выбросьте WordPress и начните пилить так, как вам привычнее и удобнее - чистым PHP без каких-либо CMS (или на базе знакомого фреймворка). Потому что то, что вы пытаетесь сделать, это какой-то сюр. Перед тем, как садиться за столь нетривиальную задачу как создание региональной структуры на базе WP, необходимо начать с простого и понять как этот самый WP работает внутри. Не наоборот.
    Ответ написан
  • Как отобразить сумму значений из мета полей постов со статусом 'private'?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Внимательно читаем документацию:

    post_status (string / array) - use post status. Retrieves posts by Post Status. Default value is 'publish', but if the user is logged in, 'private' is added. Public custom statuses are also included by default. And if the query is run in an admin context (administration area or AJAX call), protected statuses are added too. By default protected statuses are 'future', 'draft' and 'pending'.


    То есть, значения по умолчанию вам не подходят и необходимо явно указать необходимые статусы. Минимум:

    $args = [
        'post_status' => [ 'publish', 'private' ],
    ];


    Или совсем явно:

    $args = [
        'post_status' => 'any',
    ];


    ЗЫ: И не делайте 'posts_per_page' => -1,, это плохая практика. Укажите пусть большое (с запасом), но конкретное число. Например 100, 500, 1000.
    Ответ написан
    2 комментария
  • WordPress - Как в админ панели, в списке постов выделить цветом посты определенной категории?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    +1 к ответу yarovikov
    Вот пример вывода html одной строки таблицы:
    <tr id="post-25868" class="iedit author-other level-0 post-25868 type-post status-publish format-standard has-post-thumbnail hentry category-podrostkovye-strizhki category-strizhki">
    ...
    </tr>

    Категории добавляются в виде классов category-{term_name}. Соответственно, их можно спокойно стилизовать через CSS. Если же нужно цвета в админке настраивать - используйте метаданные терминов и храните в termmeta значение цвета для каждой категории. Потом на хуке admin_head берите оттуда все цвета и генерируйте стили.
    Ответ написан
  • Как подключить svg sprite на wordpress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    ПУТИ К ФАЙЛАМ.
    Проверяйте, какие пути ваш препроцессор генерит. И потом сравнивайте с теми, которые получаются в итоге относительно папки темы.
    Ответ написан
    Комментировать
  • Не отображаются фоновые иконки на псевдоэлементах?

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

    ЗЫ: Относительный путь (../ и тд) будет считаться от места, где находится итоговый CSS-файл c вашими стилями. Если это главный файл стилей темы, то он будет в корне папки темы, и с помощью ../ вы выходите из папки темы вообще. Возможно дело в этом.
    Ответ написан
    Комментировать
  • Как использовать post__not_in при подгрузке постов ajax'ом?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Использование post__not_in - не самая хорошая идея в любой ситуации, рекоммендуется его избегать. Почитайте вот тут, как решаются подобные задачи.
    Ответ написан
    1 комментарий
  • Wordpress и собственная логика, возможно ли?

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

    1. WordPress в процессе выполнения подключает кучу файлов - и своих, из ядра, и пользовательских.

    2. Любой пользовательский код, где бы он ни находился - в mu-плагине, в обычном плагине, в шаблонах темы, в functions.php или в файле, который подгружается с помощью autoload вообще из другой папки при использовании Composer - абсолютно любой пользовательский файл подключается и выполняется идентично и одинаково. Для PHP и для WordPress это просто код, который надо выполнить.

    3. Разница между тем, куда помещать свой пользовательский код только в удобстве и очередности подключения и исполнения этого кода, а также обновления и прочие плюшки. Исходя из этого:

    - mu-плагин обычно 1 php-файл, его нельзя отключить в админке, выполняется из пользовательского кода условно первым. Не использует систему обновлений плагинов, поэтому изменения надо заливать вручную. Выполняется до pluggable функций WP, то есть может их переопределять. Используется для разных задач, когда конкретный пользовательский код нужно выполнить ДО обычных плагинов, когда он критичен для работы проекта и его нельзя отключать и тд. При смене темы сайта функциональность из mu-плагина остается.

    - обычный плагин - может быть как простым (1 файл), так и любой сложности. Выполняется после mu-плагинов, перед pluggable. Используется для всего остального. Можно выключить из админки, обновить (с WP.org, сайта разработчика и даже со своего репозитория), при смене темы сайта остается.

    - functions.php активной темы. Загружается после обеих типов плагинов, сразу перед срабатыванием хука init. При смене темы, разумеется, любая функциональность которая определена в этой файле будет утеряна. Обновляется вместе с темой. Еще стоит помнить про то, что их может быть 2 - родительской темы и дочерней.

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

    Для WordPress в целом абсолютно все равно, где будет ваш код. И да, ваша функция / класс будет идентично работать (и по производительности в том числе), не важно где она будет - в functions.php или в плагине. Это будет все та же функция или класс, только в случае с плагином в голове документа будет блок с комментарием, который и определяет, что это плагин. Все. Больше никакой разницы.
    Ответ написан
    Комментировать
  • Почему worpress добавляет перед каждым символом (') или ("). (\) В методе get и post?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Потому что безопасность. Читаем документацию PHP-функции addslashes() и возвращаемся к основам, учить матчасть.
    Ответ написан
  • Как в админке вордпресса создать отдельную страницу?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Да, можно. Для "добавления фильмов, проектов" и тд - скорее всего произвольные типы данных (Custom Post Types). Для всяких настроек глобальных - страницы настроек (Option Pages).

    С вашим текущий уровнем (не)понимания WordPress вам путь прямиком на wp-kama.ru и WordPress Codex. Изучите документацию от А до Я, и все прояснится. А уже по тонкостям мы тут всегда поможем.
    Ответ написан
  • Как в wordpress привязать посты к дням месяца и выводить в зависимости от выбранного дня?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    1. День храним в postmeta (произвольное поле) или в таксономии (дни ведь будут повторяться, 1...31, верно?)
    2. Выводим запросом get_posts() или WP_Query, составим параметры в нужном виде (meta_query если произвольное поле, tax_query если таксономия)
    3. Профит.

    Если совсем грубо, в вашем ajax-коллбеке (php-функции) добавляем:
    $args = [
        'posts_per_page' => 1, // запись ведь у нас одна будет
        'no_found_rows' => true, // не нужно SQL_CALC_FOUND_ROWS, запрос будет сильно быстрее выполняться
        'post_type' => 'custom_post_type_name', // название кастомного типа записи
        'post_status' => 'publish', // только опубликованные
        // тут пишем meta или tax подзапрос (см. ссылки на документацию выше)
    ];
    $query = new WP_Query( $args );
    // Наш пост будет в массиве $query->posts
    $post = reset( $query->posts );
    // Ну или делайте обычный WordPress Loop - тут уж как удобнее.


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

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Для начала:
    1. Не используйте -1 в posts_pet_page, это плохая практика. Используйте достаточно больше, но ограниченное число, например 100.
    2. $args2 = new WP_Query какое-то нелогичное название переменной, там $posts или $places просятся.
    3. Цикл вывода покажите. Скорее всего проблема там.
    Ответ написан
    Комментировать
  • Шаблон архива для таксономии ВП. Как сделать?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Если шаблон один и тот же для архива post type и для архива терминов taxonomy, привязанных к данному post type, то чтобы его не дублировать, делают вот так:
    /**
     * Use one template for both post type archive and taxonomy archive.
     *
     * @param string $template
     * @return string
     */
    function goods_shared_archive_template( $template )
    {
    	if ( is_post_type_archive( 'goods' ) || is_tax( 'goods-taxonomy' ) ) {
    		return locate_template( [ 'goods-archive.php' ] );
    	}
    
    	return $template;
    }
    add_filter( 'template_include', 'goods_shared_archive_template', 99 );
    Ответ написан
    Комментировать
  • На чем писать шаблон wordpress в 2019?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Как ни крути, а писать тему в 2019 году придется на HTML + CSS + JavaScript + PHP, как и 10 лет назад. Использовать ли какие-то новомодные фреймворки и библиотеки - зависит исключительно от ваших задач, привычек и навыков. Ни одно из упомянутых хайповых словечек (npm, vue, react и тд) не является обязательным и даже необходимым.
    Ответ написан
    Комментировать
  • Вернуть старую версию wordpress и php?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Во-первых, вы путаете версии движка PHP и движка WordPress. Это разные версии и их обе откатывать не нужно. Во-вторых, вероятнее всего вам вообще ничего не надо откатывать, а нужно устранить PHP Warning, то есть ошибку в коде, которая вызывает это сообщение. И хотя на первый взгляд ошибка ведет в wp-includes/blocks.php:183, в реальности наверняка она выше по стеку. Нужно смотреть все сообщение об ошибке целиком, включая Stack Trace.
    Ответ написан
    1 комментарий
  • Как изменить сортировку записей в Wordpress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Изменение параметров запроса до его выполнения делается на хуке pre_get_posts:
    function posts_default_order( $query )
    {
        // Прекращаем выполнение, если это не главный запрос и мы не в админке.
        if( ! $query->is_main_query() || ! is_admin() ) {
            return;
        }
    
        // Значения: date/post_date, modified/post_modified.
        $query->set( 'orderby', 'date' );
        $query->set( 'order', 'DESC' );
    }
    add_action( 'pre_get_posts', 'posts_default_order' );
    Ответ написан
    6 комментариев