Ответы пользователя по тегу WordPress
  • Как правильно указать и получить id по ссылке на wordpress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Предполагаю, что ID в коде у вас доступен, а для формирования параметров запроса вам поможет add_query_arg()
    Ответ написан
    1 комментарий
  • Как публиковать в блок не больше 10 записей?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Я уже несколько раз отвечал подробно с примерами кода на вопросы в стиле "как вывести по другому каждые X записей". Принцип везде один и тот же, включая ваш случай - в цикле проверяете кратность текущей итерации вашему Х (в данном случае - 10) и дописываете нужный фрагмент html-кода, если проверка возвращает true.

    Вот например:
    Как правильно написать формулу для вывода элементов на экран?
    Wordpress цикл bootstrap grid?
    Wp default loop break?
    Ответ написан
    3 комментария
  • Как разделить страницу wordpress на несколько частей?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    А в шаблоне страницы под the_content() есть wp_link_pages()?

    https://codex.wordpress.org/Styling_Page-Links
    Ответ написан
  • Как считать загрузки WordPress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    А сам файл загружаю в корень сайта

    Лично я файлы загружаю через админку как стандартные attachment. Прямо из нужных записей / post types. А поскольку attachment - это тоже post type, то в него можно писать post_meta, в котором и хранить количество загрузок.
    Ответ написан
    Комментировать
  • Где найти тренера/наставника по wordpress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Пример вопроса: сайт aviatech.carapax.ru, cms wordpress, theme salient. Fancybox на главной неадекватно ведут себя при изменении размера экрана. Как поправить?

    Это вопрос чисто по верстке, WordPress тут вообще ни при чем.

    Я менторил людей, но моя сфера - именно WP, бекенд, если фронт - то только специфичные для WP моменты. В этой области - всегда рад помочь советом, по мере наличия времени. Но на общий вопрос по html/js/css, если он никак не касается особенностей WP, я отвечать вообще не собираюсь. Для этого нужен ментор по html/js/css.

    Чтобы найти тренера/ментора/наставника, нужно сначала понять кто есть падаван, а кто есть наставник, какие их роли и тд. Ваш вопрос демонстрирует непонимание уровня отношений между наставником и учеником, поэтому потенциальный ментор, прочитав этот вопрос, просто пройдет мимо.
    Ответ написан
  • Вывод последних комментариев с учетом даты?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Функция get_comments() принимает целый вагон параметров, одним из которых является date_query, с помощью которого можно отфмльтровать по дате:
    $comments = get_comments([
        'status' => 'approve',
        'number' => 5,
        'date_query' => [
            'before' => 'now',
            'inclusive' => false,
        ],
    ]);

    ЗЫ: Код не тестировал, нет под рукой сайта с комментами. Должно работать, если нет - обратитесь к документации WP_Date_Query.
    Ответ написан
    1 комментарий
  • Могу ли я изменить плагин в wp?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    В официальной документации смотрели? Там куча интересных хуков, с примерами кода.
    Ответ написан
    Комментировать
  • Как вывести определенное количество постов для произвольный типов записей?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Теперь в файле archive-portfolio.php я прописал цикл wp_query и указал вывести 10 записей. У меня всего их 10 шт.

    Не нужно так, это facepalm. У вас уже есть основной запрос, который возвращает 2 записи, а вы поверх колбасите новый запрос, чтобы вернуть 10. Выполняются оба. Для модификации основного запроса есть хук pre_get_posts:

    function modify_main_query( $query ) 
    {
        if ( is_admin() || ! $query->is_main_query() ) {
            return;
        }
    
        if ( is_post_type_archive( 'portfolio' ) ) {
            // Display 10 posts for a custom post type called 'portfolio'
            $query->set( 'posts_per_page', 10 );
            return;
        }
    }
    add_action( 'pre_get_posts', 'modify_main_query' );
    Ответ написан
    1 комментарий
  • Как передать все полученные ID через функцию для in_category?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    1. Никогда не выполняйте SQL-запросы (через функции типа get_term_my()) в цикле. Перед началом цикла получите все термины с помощью get_terms(), а дальше уже циклом по результатам идете и обращаетесь к term_id.
    2. Ну и да, Пычев Анатолий правильно написал - echo у вас там, а значит в if() проверки не будет, потому что проверка ожидает возврат результата true|false. А у вас void.
    3. К тому же, in_category() ожидает массив ID, который вы и так уже получаете с помощью get_term_children(), зачем получать термины целиком - непонятно.

    // 1. get_term_children() вернет массив ID терминов.
    $children_ids = get_term_children( 1, 'category' );
    
    // 2. in_category() как раз такой массив терминов и ожидает.
    if ( in_category( $children_ids ) ) {
        // 
    }


    Остальной код вам не нужен, по крайней мере не для этих целей.
    Ответ написан
    Комментировать
  • Как убрать конфликт плагинов в wordpress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Uncaught TypeError: j$(...).appear is not a function
    Uncaught TypeError: j$(...).hasClass is not a function

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

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Есть только функция is_main_query(), которая позволяет отделить основной запрос от вторичных. Такого, чтобы определить, что запрос идет от виджета - из коробки не существует. Впрочем, можно создать свой виджет на базе существующего, и там уже вписать нужные условия в самом WP_Query
    Ответ написан
  • Какой аналог для acf использовать для создания опции тем и повторяющийся полей?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Пересел на acf, но очень не хватает повторяющейся полей и опций для темы.

    В ACF Pro есть страницы опций и поле Repeater. Лицензия стоит божеских денег и она разовая (пока еще), не требует ежегодного продления.

    Нашел плагин подс, но судя по описанию, он не умеет этого делать.

    Умеет, но с Pods я бы лично не советовал вам связываться. Плагин хорош, но он developer first, требует достаточно много доработки напильником.

    Есть еще Metabox.io, но дополнительные фичи там тоже платные. Плагин тоже хорош, местами даже удобнее/приятнее ACF Pro, но если сравнивать все за и против, то ACF Pro с его pricing model + офигенной поддержкой Gutenberg побеждает, всегда.
    Ответ написан
    1 комментарий
  • Почему не устанавливаются cookie в Wordpress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Из документации (жирным выделил то, что важно):
    setcookie() задает cookie, которое будет передано клиенту вместе с другими HTTP-заголовками. Как и любой другой заголовок, cookie должны передаваться до того как будут выведены какие-либо другие данные скрипта (это ограничение протокола). Это значит, что в скрипте вызовы этой функции должны располагаться до остального вывода, включая вывод тегов и , а также пустые строки и пробельные символы.

    Из-за этого не работает в footer.php. Если бы у вас был включен режим отладки и вывод ошибок, то вы бы увидели что-то типа:
    Warning: Cannot modify header information - headers already sent by (output started at /Users/Ihor/Code/playground/wp-includes/class.wp-styles.php:242) in /Users/Ihor/Code/playground/wp-content/themes/playground/footer.php on line 8

    Далее, пример с хуком init работает, но есть 2 нюанса. Во-первых, у вас ошибка - константы DAYS_IN_SECONDS не существует, должна быть DAY_IN_SECONDS. Далее, опять идем в документацию по поводу этого параметра (жирным выделил то, что важно):
    expires
    Время, когда срок действия cookie истекает. Это метка времени Unix, то есть количество секунд с начала эпохи. Другими словами, желательно задавать это время с помощью функции time(), прибавляя время в секундах, через которое срок действия cookie должен истечь. Либо можно воспользоваться функцией mktime(). time()+60*60*24*30 установит срок действия cookie 30 дней. Если задать 0 или пропустить этот аргумент, срок действия cookie истечет с окончанием сессии (при закрытии браузера).

    На языке кода это будет:
    function my_setcookie_example()
    {
    	setcookie(
    		'testing',
    		'123',
    		time() + 30 * DAY_IN_SECONDS, // вот так должно быть
    		COOKIEPATH,
    		COOKIE_DOMAIN
    	);
    }
    add_action( 'init', 'my_setcookie_example' );

    Во-вторых, из той же документации (жирным выделил то, что важно):
    После передачи клиенту cookie станут доступны через массив $_COOKIE при следующей загрузке страницы. Значения cookie также есть в $_REQUEST.

    То есть, ваше var_dump($_COOKIE['testing']); сработает только после перезагрузки, а при первой попытке - NULL и:
    Notice: Undefined index: testing in /Users/Ihor/Code/playground/wp-content/themes/playground/functions.php on line 134
    .

    RTFM.
    Ответ написан
  • Как при отсутствии thumbnails в записи, выводить thumbnail заглушку?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Ответ Вадим Кот полностью подходит, если надо в конкретном месте шаблона разово запилить. Но если это должно быть как стандартное поведение везде, где есть post thumbnails, а сторонний плагин ставить не хочется, то лучше написать свою функцию. У меня она среди прочих полезных лежит в mu-plugin'е, но можно и в functions.php:
    /**
     * Display native post thumbnail or a fallback image.
     *
     * @param  string  $size
     * @param  string  $attr
     */
    function the_post_thumbnail_fallback( $size = 'post-thumbnail', $attr = '' )
    {
    	if ( has_post_thumbnail() ) :
    		echo get_the_post_thumbnail( null, $size, $attr );
    
    	else :
    		$post_thumbnail_id = get_option( 'default_post_thumbnail' );
    
    		$html = wp_get_attachment_image( $post_thumbnail_id, $size, false, $attr );
    
    		/**
    		 * Filters the post thumbnail HTML.
    		 *
    		 * @param  string  $html  The post thumbnail HTML.
    		 * @param  int  $post_id  The post ID.
    		 * @param  string  $post_thumbnail_id  The post thumbnail ID.
    		 * @param  string|array  $size  The post thumbnail size. Image size or array of width and height values (in that order). Default 'post-thumbnail'.
    		 * @param  string  $attr  Query string of attributes.
    		 * @since 2.9.0
    		 */
    		echo apply_filters( 'post_thumbnail_html', $html, null, $post_thumbnail_id, $size, $attr );
    
    	endif;
    }

    В шаблонах просто используем эту функцию вместо the_post_thumbnail(), включая необходимые параметры (размер и тд):
    <header class="post-header">
        <h1 class="post-title">
            <?php the_title(); ?>
        </h1>
    
        <div class="post-thumbnail">
            <?php the_post_thumbnail_fallback(); ?>
        </div>
    </header>

    В самой функции the_post_thumbnail_fallback() обратите внимание на строчку
    $post_thumbnail_id = get_option( 'default_post_thumbnail' );

    Сама картинка загружена через медиабиблиотеку, ее ID хранится в wp_options. У меня это реализовано в настройках (как и в плагине, на который ссылается Вадим Кот), но можно захардкодить ID прямо в этой функции. HTML создается нативной wp_get_attachment_image(), идентично тому что создаст the_post_thumbnail() потому что она использует эту же функцию.

    Также здесь у нас сохранен фильтр post_thumbnail_html, с помощью которого сторонние плагины могут модифицировать html-код тега img - а это могут быть вполне полезные фичи - SEO, css-классы (например для lazyload), responsive и тд.
    Ответ написан
    Комментировать
  • Автогенерация страниц?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Конечно можно - wp_insert_post() и вперед. Есть плагины-импортеры на все вкусы. Если у вас текст уже есть в какой-то БД, то проще всего написать скрипт-миграцию, который пройдется по этой БД и создаст необходимые страницы с помощью вышеупомянутой функции. Можно даже в метаданных хранить внешний ID контента этой страницы, и по расписанию сверять с оригинальной базой, при необходимости делать обновления или новые тексты заливать в новые страницы. Все реализуемо.
    Ответ написан
    1 комментарий
  • Можно ли поставить платную тему Wordpress с themeforest сперва на локальный сервер, а потом уже на хостинг?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Да, можно. Лицензия позволяет и вообще это нормально. Как минимум есть локалка, стейдж и прод.
    Ответ написан
    3 комментария
  • Как вывести категории на мультиязычном сайте?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Я с Polylang давно не работал, может там апишка поменялась уже, но в целом смысл в том, чтобы вместо parent => 21 (фиксированный ID на одном языке) передавать parent => {ID отфильтрованный через Popylang}. Вот так:

    $categories = get_categories([
      'taxonomy'     => 'category',
      'type'         => 'post',
      'child_of'     => '',
      'parent'       => pll_get_term(21),
      'orderby'      => 'name',
      'order'        => 'ASC',
      'hide_empty'   => 0,
      'hierarchical' => 1,
      'exclude'      => '',
      'include'      => '',
      'number'       => 0,
      'pad_counts'   => false,
    ]);

    https://polylang.wordpress.com/documentation/docum...
    Ответ написан
  • Как исправить ошибку в валидации сайта на wordpress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Тег link может быть использован только внутри document head, а у вас он в document body.

    И это ошибка валидации HTML, к WordPress это не имеет никакого отношения, уберите ненужные теги.
    Ответ написан
    Комментировать
  • Как убрать посты с статусом (удалены или черновик) общего списка?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Вы выборку делаете по таблице wp_postmeta. В этой таблице хранится только ID записи. Чтобы узнать (и отфильтровать) по ID статус этой записи, используйте JOIN с таблицей wp_posts:
    SELECT post_id, post_status, meta_value
    FROM wp_postmeta
    JOIN wp_posts
    ON wp_postmeta.post_id=wp_posts.id
    WHERE meta_key = 'data-provedeniya' AND post_status = 'publish'
    Ответ написан
    1 комментарий
  • Получить доступ к БД из своего класса WordPress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Ваш код выполняется ВНЕ контекста WP, поэтому global $wpdb всегда будет возвращать null - ибо в вашем текущем глобальном scope (вашего кастомного кода который никак не связан с WP) данной переменной нет. Чтобы она там появилась, вам нужно подгрузить минимально необходимую часть ядра WP:
    define( 'SHORTINIT', true );
    require( '/path/to/wp-load.php' );
    Ответ написан
    1 комментарий