Ответы пользователя по тегу WordPress
  • Как искать медиафайлы по их фактическому названию в WP?

    irtek
    @irtek
    Wordpress-addicted
    Добавьте этот код в functions.php вашей темы

    add_filter( 'posts_search', 'qna_habr_q695436', 10, 2 );
    
    function qna_habr_q695436( $search, $wp_query ) 
    {
        global $wpdb, $page;
    
        if ( !is_admin() && 'upload.php' != $page ) 
            return $search;
    
        // Корректируем запрос
        $search = str_replace(
            'AND ((', 
            'AND (((' . $wpdb->prefix . 'posts.guid LIKE \'%' . $_GET['s'] . '%\') OR ', 
            $search
        ); 
    
        return $search;
    }
    Ответ написан
  • Как написать правильно эту строку php?

    irtek
    @irtek
    Wordpress-addicted
    <!-- Так выведет первую из меток поста, если их вдруг больше, чем одна -->
    <div class="portfolio <?= get_the_tags($post->ID)[0]->slug; ?>" data-cat="<?= get_the_tags($post->ID)[0]->slug; ?>">


    // Еще варианты
    
    // Получим все метки поста
    $tags = get_the_tags($post->ID); 
    
    // Добавим проверку наличия меток
    // Если есть хотя бы одна метка
    // в переменной $tag будет slug первой метки
    if($tags) {
        $tag = $tags[0]->slug;
    }
    
    // далее если нужно получить список меток поста, если их больше одной
    $all_post_tags = '';
    
    foreach ($tags as $key => $tag) {
        $all_post_tags .= $tag->slug . ' ';
    }


    <!-- Так выводить если знаете, что метка будет только одна -->
    <div class="portfolio <?= $tag; ?>" data-cat="<?= $tag; ?>">
    
    <!-- Так выводить если меток несколько и все они будут в class -->
    <div class="portfolio <?= $all_post_tags; ?>">
    Ответ написан
  • Почему не отображаются картинки после переноса сайта на локальный сервер?

    irtek
    @irtek
    Wordpress-addicted
    Когда указывает домен в url изображения необходимо указывать протокол http:// или https:// чтобы сервер не открывал это в рамках вашего сайта, либо указывать без домена адрес, т.е.
    background-image: url('http://site.ru/wp-content/uploads/...
    background-image: url('//site.ru/wp-content/uploads/...
    background-image: url('/wp-content/uploads/...


    все варианты будут правильные. Вначале // это сокращенный вариант без уточнения http или https
    Ответ написан
  • WordPress - получить мета поля постов и сложить их?

    irtek
    @irtek
    Wordpress-addicted
    // параметры для запроса WP_Query
                $args = array(
                    'post_type' => 'post'
                );
    
                $query = new WP_Query( $args );
                $posts = $query->posts;
    
                $summ = 0;
    
                foreach ($posts as $post) {
    
                    $summ += get_post_meta($post->ID, 'meta_key', true);
    
                }
    
                wp_reset_postdata();
    
                echo $summ;
    Ответ написан
  • Почему не работают хуки?

    irtek
    @irtek
    Wordpress-addicted
    Дело в том, что данная функция не делает запросов, а сверяет данные с глобальной переменной $wp_taxonomies, которая в functions.php не определена. Эта функция заработала бы в файле шаблона.

    Чтобы получить в functions.php все зарегистрированные к текущему моменту (по поводу этого выделения будет комментарий ниже) таксономии воспользуйтесь функцией get_taxonomies()

    $taxonomies = get_taxonomies('products', 'objects');


    в такой переменной будут данные и ваш код дальше заработает.

    Обращу еще внимание на подводные камни вашей задачи.
    В этой переменной изначально будут содержаться только базовые таксономии WP: category, post_tag, nav_menu, link_category, post_format

    Если вы создавали свою таксономию через register_taxonomy, то она попадет в этот массив, ЕСЛИ код register_taxonomy находится в functions.php ВЫШЕ данного кода или если функция регистрации таксономии подключена к хуку инициализации 'init' (!), что правильнее всего. А если вы регистрировали таксономию через плагин, например, через популярный Custom post ui и т.п. то и вовсе не попадет сюда, т.к. регистрация таксономий в плагине происходит раньше срабатывания functions.php
    Ответ написан
  • WordPress. Как с помощью wp_enqueue_script() подключить скрипт Bootstrap 4 с атрибутом integrity?

    irtek
    @irtek
    Wordpress-addicted
    Есть хук для строковой замены выводимой строки подключения скрипта.
    Вот такой код для functions.php
    function add_integrity_attribute($tag, $script_handle) {
    // Если подключаемый скрипт не бутстрап, то возвращаем как обычно
        if ( $script_handle !== "bootstrap" ) {
            return $tag;
    } else {
    // Если бутстрап, то заменяем в строке <script .... "src на src с нашим атрибутом
        return str_replace( ' src', ' integrity="sha384-alpBpkh1PFOepccYVYDB4do5UnbKysX5WZXm3XxPqe5iKTfUKjNkCk9SaVuEZflJ" src', $tag );
    }
    }
    add_filter('script_loader_tag', 'add_integrity_attribute', 10, 2);


    Скрипт нужно подключать с handle = bootstrpap, т.е.
    wp_enquee_script('bootstrap', ..... ); Или измените на любой другой, только не забудьте изменить в функции подстановки атрибута.
    Ответ написан
  • Как отключить jq на определённой страницы в Wordpress?

    irtek
    @irtek
    Wordpress-addicted
    Есть функции, которые отключают регистрацию скрипта jquery в Wordpress, в которых можно настраивать разные url к скриптам.

    Эти функции отменят регистрацию скрипта jquery (функции вставляются в файл functions.php темы)
    wp_deregister_script( 'jquery' );
    wp_deregister_script( 'jquery-core' );


    Есть функция, которая регистрирует скрипт jquery в Wordpress (НО НЕ ПОДКЛЮЧАЕТ). также вставляется в functions.php
    wp_register_script('jquery', 'URL скрипта', false, null, true );


    И есть функция, которая ПОДКЛЮЧАЕТ скрипт
    wp_enqueue_script('jquery', 'URL скрипта', false, null, true );


    Таким образом вы можете, во первых функциями deregister отменить текущее подключение и скрипт jquery, командой wp_register_script зарегистрировать скрипт, а затем подключать где нужно простой командой
    wp_enqueue_script('jquery'); там где нужно.

    1. Вы можете подключить скрипт на нужной странице добавив
    wp_enqueue_script('jquery');  // если ранее jquery был зарегистрирован или напрямую функцией
    wp_enqueue_script('jquery', 'URL скрипта', false, null, true );

    Функции вставлять ДО в шапке get_header();

    Вы также можете настроить подключение в functions.php конструкцией ниже. Обращаю внимание, что команда определения страницы is_page() не работает в functions php, поэтому можно добавить через функцию, повесив ее на хук. В рамках этой функции будет работать условная команда определения на какой странице включать jquery, а на какой нет.

    add_action('wp_enqueue_scripts', 'toster_q_479904', 99);
    function toster_q_479904() {
    if(is_page('about') {
    	wp_enqueue_script('jquery', 'URL скрипта', false, null, true );
    }
    }
    Ответ написан
  • Можно ли отключить jq от определённой страницы в wordpress?

    irtek
    @irtek
    Wordpress-addicted
    У вас чья-то готовая тема? Смотря как подключен jquery.
    Есть функции, которые отключают регистрацию скрипта jquery в Wordpress

    Эти функции отменят регистрацию скрипта jquery (функции вставляются в файл functions.php темы)
    wp_deregister_script( 'jquery' );
    wp_deregister_script( 'jquery-core' );


    Есть функция, которая регистрирует скрипт jquery в Wordpress (НО НЕ ПОДКЛЮЧАЕТ). также вставляется в functions.php
    wp_register_script('jquery', 'URL скрипта', false, null, true );


    И есть функция, которая ПОДКЛЮЧАЕТ скрипт
    wp_enqueue_script('jquery', 'URL скрипта', false, null, true );


    Таким образом вы можете, во первых функциями deregister отменить текущее подключение и скрипт jquery, командой wp_register_script зарегистрировать скрипт, а затем подключать где нужно простой командой
    wp_enqueue_script('jquery'); там где нужно.

    1. Вы можете подключить скрипт на нужной странице добавив
    wp_enqueue_script('jquery');  // если ранее jquery был зарегистрирован или напрямую функцией
    wp_enqueue_script('jquery', 'URL скрипта', false, null, true );

    Функции вставлять ДО в шапке get_header();

    Вы также можете настроить подключение в functions.php конструкцией ниже. Обращаю внимание, что команда определения страницы is_page() не работает в functions php, поэтому можно добавить через функцию, повесив ее на хук. В рамках этой функции будет работать условная команда определения на какой странице включать jquery, а на какой нет.

    add_action('wp_enqueue_scripts', 'toster_q_479898', 99);
    function toster_q_479898() {
    if(is_page('about') {
    	wp_enqueue_script('jquery', 'URL скрипта', false, null, true );
    }
    }
    Ответ написан
  • WP Walker, как убрать контейнер у дочерних пунктов?

    irtek
    @irtek
    Wordpress-addicted
    Если сходу, то можно так.

    В Walker внизу есть блок
    $item_output = sprintf( '%1$s<a%2$s>%3$s%4$s%5$s</a>%6$s',
          $args->before,
          $attributes,
          $args->link_before,
          apply_filters( 'the_title', $item->title, $item->ID ),
          $args->link_after,
          $args->after
        );


    В первой строке нужно заменить
    '%1$s%3$s%4$s%5$s%6$s'
    на переменную и добавить условие вложенности

    // Все меню кроме верхнего уровня убираем замены перед <a ... > и после </a>
    if($depth >= '1') {
    $sprf = '<a%2$s>%3$s%4$s%5$s</a>';
    } else {
    $sprf = '%1$s<a%2$s>%3$s%4$s%5$s</a>%6$s';
    }
    
    $item_output = sprintf( $sprf,
          $args->before,
          $attributes,
          $args->link_before,
          apply_filters( 'the_title', $item->title, $item->ID ),
          $args->link_after,
          $args->after
        );
    Ответ написан
  • Вывод новостей только с thumbnail на главную страницу из определённой рубрики, как реализовать?

    irtek
    @irtek
    Wordpress-addicted
    Для определения наличия thumbnail подойдет функция
    https://developer.wordpress.org/reference/function...

    Внутри цикла вывода постов добавить условие
    if(has_post_thumbnail( $post->ID )) {
    
           // Здесь вывод поста, у которого есть thumbnail
    
    }
    Ответ написан
  • Как вывести данные доп полей на страницу WP?

    irtek
    @irtek
    Wordpress-addicted
    Вероятно, в неверном определении $post->ID. Часто бывает, что предыдущие циклы сбивают.
    Попробуйте вывести <? echo $post->ID; ?> непосредственно перед выводом мета поля и сравните ID с ID текущего поста. Соответствует ли. Т.к. вышеизложенный вами код должен спокойно работать.
    Ответ написан
  • Нагрузка на Wordpress?

    irtek
    @irtek
    Wordpress-addicted
    Вопросы будут и к хостингу (нужен VPS настроенный)
    И к Вордпрессу. В ситуации с 300 тыс записей 100% категоричный отказ от встроенных функций ВП. Даже не пытайтесь. Все фильтры писать вручную с оптимизированными запросами в базу. Стараться по максимуму сократить переборы базы, т.к. его meta_query и прочие встроенные фильтры делают многократные бессмысленные переборы таблиц.

    О цифрах по опыту
    При оптимизированном VPS на 1 ядре + 1 Гб ОЗУ спокойно работают встроенные фильтры ВП (140 тыс записей) + 7 параметров фильтрации. Но при более сложном фильтре, чем простой отбор параметров появились проблемы даже при росте мощностей до 4 ядер + 4 Гб ОЗУ. Тормоза ощутимые, особенно при одновременной пользовательской активности в 150-200 человек. Оптимизировали сложные запросы, сделали их вручную и все вернулось к прежним 1 ядро + 1 Гб ОЗУ.

    На сайте с 420 тысячами записей появились проблемы с фильтрами встроенными сразу. Переписали вручную и проблему сняли, для надежности работает на VPS 3 ядра + 2 Гб ОЗУ.
    Обязательное использование кэширования запросов, например сервера Memcache. Также использовать встроенное транзитное кэширование ВП. Эти два подхода снимут любую проблему нагрузки на базу и фильтры наполовину.

    Переход на php 7.0 в последнее время положительно сказался на работу ВП.

    Насчет серверной оптимизации
    При работе публично в обязательном порядке закрыть wp-login.php, xmlrpc.php, а также wp-json REST API. Данные мероприятия исключат любую лишнюю нагрузку от ботов. Отфильтровать доступ к папкам wp-admin и wp-includes, а также закрыть доступ к php кроме сервера к wp-content/plugins и папки темы.
    Ответ написан
  • Как настроить поиск записей в админке WP?

    irtek
    @irtek
    Wordpress-addicted
    Этот поиск в админке ищет и по заголовку и по содержанию.
    Если вы хотите, чтобы данный поиск искал только по заголовкам, то добавьте данный код в файл functions.php вашей темы.

    function search_only_title_toster_q411859($search, &$wp_query) {
    	global $wpdb;
    	if (empty($search)) {
    		return $search;
    	}
    
    	$q = $wp_query->query_vars;
    	$n = !empty($q['exact']) ? '' : '%';
    	$search =
    	$searchand = '';
    	foreach ((array) $q['search_terms'] as $term) {
    		$term = esc_sql(like_escape($term));
    		$search .= "{$searchand}($wpdb->posts.post_title LIKE '{$n}{$term}{$n}')";
    		$searchand = ' AND ';
    	}
    	if (!empty($search)) {
    		$search = " AND ({$search}) ";
    		if (!is_user_logged_in()) {
    			$search .= " AND ($wpdb->posts.post_password = '') ";
    		}
    
    	}
    	return $search;
    }
    add_filter('posts_search', 'search_only_title_toster_q411859', 500, 2);
    Ответ написан
  • Как в Wordpress сделать одинаковые slug для записей в разных категориях?

    irtek
    @irtek
    Wordpress-addicted
    Данную задачу можно решить уйдя от стандартных понятий категорий и постов в WordPress. С ходу приходит решение - это перебросить данные записи в отдельный post_type с иерархичной структурой и соответственно категории будут постами верхнего уровня, а записи в этих категориях их дочерними. По аналогии с разделом "Страницы". Тогда у вас получится такая структура.
    Если принципиально, чтобы были посты, то добавить кодом в functions.php стандартным постам WordPress иерархию по аналогии со страницами.

    В случае использования категорий или таксономий WordPress по своей структуре не позволит одинаковые имена для постов, т.к. они публикуются без иерархии в один уровень, а значит каждый имеет уникальный post_name. Иерархия появляется при добавлении параметра post_parent . В случае с иерархичностью вашу задачу решить проще, но в такой ситуации роль категорий будет выполнять выпадающий список справа, где мы выбираем "Родительскую страницу" и это может быть несколько не удобно для редактора в дальнейшем, но если статично перекинуть и вывести, то вполне подойдет такое решение.
    Ответ написан
  • Как перебрать все подрубрики (1 уровень) определенной рубрики в цикле?

    irtek
    @irtek
    Wordpress-addicted
    Для такой задачи вместо get_categories() лучше использовать get_terms()

    Базовое использование:
    $args = array(
    	'taxonomy'      => array( 'category' ), // название таксономии (рубрики) можно несколько через запятую в кавычках
    	'orderby'       => 'id', 
    	'order'         => 'ASC',
    	'hide_empty'    => true, 
    	'parent'         => 0, // здесь указываем 0, чтобы получить элементы только одного уровня без вложенностей
    	'child_of'      => 0, // здесь указываем ID рубрики, подрубрики которой хотим получить
            'pad_counts' => 1 // этот параметр посчитает количество подрубрик в рубриках
    ); 
    
    $myterms = get_terms( $args );
    
    // проходимся по массиву и получаем объекты, которые можно вывести как нужно.
    foreach( $myterms as $term ){
    	print_r($term); 
    // или конкретно
    echo $term->title; // выведет название рубрики
    echo $term->term_id; // выведет ID подрубрики
    echo $term->count; // выведет число подрубрик (3 уровень) в выводимой подрубрике (2 уровень)
    }


    Обязательно посмотрите справку по функции get_terms() чтобы добавить в функцию остальные параметры если нужно. Например, здесь https://wp-kama.ru/function/get_terms
    Ответ написан
  • Как вывести ссылку и картинку на товар?

    irtek
    @irtek
    Wordpress-addicted
    <?php echo get_post_permalink(); ?>

    заменить на

    <?php echo get_permalink( $cat_post->ID ); ?>

    Этот блок

    <?php $image = get_field('custom_image_incategory'); ?>
                <?php if ( $image ) { ?>
                    <a href="<?php echo get_permalink( get_the_ID() ) ?>"><img src="<?php echo $image['url']; ?>" alt="<?php echo $image['alt']; ?>" /></a>
                <?php } ?>


    заменить на

    <?php $image = get_field( 'custom_image_incategory', $cat_post->ID ); ?>
                <?php if ( $image ) { ?>
                    <a href="<?php echo get_permalink( $cat_post->ID ) ?>"><img src="<?php echo $image['url']; ?>" alt="<?php echo $image['alt']; ?>" /></a>
                <?php } ?>


    Поясню.
    get_the_ID() - функция не подходит, т.к. вы находитесь за рамками основного цикла query_post WordPress.
    Вы проходите командой foreach по вашему массиву объектов $category_posts
    Соответственно дальше в коде для получения ID поста нужно использовать $cat_post->ID
    Фукнция get_field(). это, вероятно, плагин Advanced Custom Fields. Этой функции также нужно передать ID поста т.к. она находится в рамках вашего цикла foreach. Добавляем вторым параметром также $cat_post->ID
    Ответ написан
  • Вирус постоянно меняет права к файлам сайта на Wordpress?

    irtek
    @irtek
    Wordpress-addicted
    У вас где-то залит shell-скрипт. В идеале нужно все переустановить.
    Wordpress в обязательном порядке, тему и все плагины. Если на сервере под одним пользователем несколько сайтов, то такой враг может быть в любом из них.

    Если у вас есть доступ к серверу по SSH, то выполните команду

    find . -type f -name '*.php' | xargs grep -l "x63" --color


    или

    find . -type f -name '*.php' | xargs grep -l "x47" --color


    "точка" после find обозначает искать в папке, в которой находитесь, замените ее на путь к папке, где лежат ваш сайт или сайты или вообще заменить на слеш / тогда искать будет по всему серверу.

    Команда ищет файлы в содержании, которых есть текст "x63" или "x47". В 99% случаях из таких кодов состоит шифровка вражеских вирусов. Обратите внимание на файлы, которые найдет команда. Откройте их и посмотрите содержание. Код вируса вы сразу увидите, он весь шифрованный base64 и присутствуют команды eval. Чистите или восстановите данные файлы на чистые.
    Ответ написан
  • Как сделать, чтобы при отсутствии показывал 0?

    irtek
    @irtek
    Wordpress-addicted
    Функция вывода количества комментариев, которую вы использовали:

    comments_popup_link( esc_html__('', 'cm'), esc_html__('1', 'cm'), esc_html__('%', 'cm') );


    имеет 3 аргумента через запятую:
    1 - esc_html__('', 'cm') - когда нет комментариев
    2 - esc_html__('1', 'cm') - когда один комментарий
    3 - esc_html__('%', 'cm') - когда больше комментариев

    в первом аргументе у вас указано ничего не выводить, когда нет комментариев. Добавьте туда 0, т.е. так

    comments_popup_link( esc_html__('0', 'cm'), esc_html__('1', 'cm'), esc_html__('%', 'cm') );
    Ответ написан
  • Владелец сайта предпочёл скрыть описание страницы. WordPress?

    irtek
    @irtek
    Wordpress-addicted
    "прошло 3 дня"
    Конечно нужно подождать. В Яндексе эта надпись исчезнет в период от 3 недель до полутора месяцев. Он очень инертный + ваш сайт новый, а значит Яндекс его посещает вначале редко до 1 раза в неделю полторы. Ктому же, обновления индекса результатов поиска Яндекса происходит не ежедневно, а раз в 3-4 дня, а то и раз в неделю.

    В файле robots.txt обязательно пропишите директиву
    Host: вашдомен.ru
    Ответ написан