Задать вопрос
Ответы пользователя по тегу WordPress
  • Как добавить div в li в каждом элементе меню wp_nav_menu()?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    В функции wp_nav_menu() есть фильтр wp_nav_menu_items

    <li id="menu-item-265" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-265">
    	<a href="http://wp-test.ru/post-99">Обратная связь</a>
    </li>
    <li id="menu-item-266" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-266">
    	<a href="http://wp-test.ru/post-98">Все статьи</a>
    </li>


    В нем разметка примерно такого вида, менять ее достаточно сложно, для парсинга HTML я использую Simple HTML Dom Parser

    Еще один вариант — переписать полностью Walker, но этот вариант еще сложнее предыдущего

    Самый простой вариант — получить массив элементов меню с помощью функции wp_get_nav_menu_items() и вывести свою разметку

    // Получаем элементы меню по ID.
    $nav_menu_items = wp_get_nav_menu_items( $menu_id );
    
    // Или получаем элементы меню по location.
    $menu_location = 'primary';
    $locations     = get_nav_menu_locations();
    
    if ( isset( $locations[ $menu_location ] ) ) {
      $nav_menu_items = wp_get_nav_menu_items( $locations[ $menu_location ] );
    }
    Ответ написан
  • Как вывести список пользователей?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    С помощью кода вам понадобится функция get_users(), с ее помощью можно получить список пользователей. Так же вам нужно знать каким именно образом данные о балансе юзера хранятся в БД, чтобы правильно составить запрос
    Ответ написан
    Комментировать
  • Структура каталога с марками авто?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Вам нужна не гет-переменная ?s=, потому что это запрос поиска. Нужно создать свои переменные и в зависимости от их наличия в ссылке, подменять заголовки и товары на хуке pre_get_posts

    Тут я уже несколько раз отвечал как делать подобные фильтры

    Ответ написан
    Комментировать
  • Как проще создать такую структуру каталога на wp?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Не совсем понятно в чем конкретно ваш вопрос заключается. Вы должны реализовать задачу в соответствии с ТЗ заказчика

    Если по ТЗ каждый товар должен иметь собственную страницу, то вы можете зарегистрировать свой тип записи с помощью register_post_type() или использовать WooCommerce, плагин для интернет-магазинов

    Если товары в админке нужны, но свои страницы делать не нужно, то да, можете сделать через повторитель ACF или Carbon Fields

    А вообще, выглядит так, что мы можете собрать простой массив товаров в php и просто вывести его как вам нужно

    $products = array(
    	1 => array(
    		'category' => 'NP',
    		'title'    => 'Титановое основание мидентика совместимое с mis',
    		'image'    => 'data/product/1.jpg',
    		'price'    => '€10',
    	);
    	2 => array(
    		'category' => 'SP',
    		'title'    => 'Титановое основание мидентика non hex совместимое с mis',
    		'image'    => 'data/product/2.jpg',
    		'price'    => '€10',
    	);
    	3 => array(
    		'category' => 'WP',
    		'title'    => 'Титановое основание мидентика совместимое с mis',
    		'image'    => 'data/product/3.jpg',
    		'price'    => '€10',
    	);
    );
    Ответ написан
  • Как разбить вывод постов в WordPress по три?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Вы можете создать счетчик и проверять, что при делении его на число 3 получается целое число и вы выводите дополнительные <div>

    // Задаем нужные нам критерии выборки данных из БД.
    $args = array(
    	'post_type'      => 'projects',
    	'posts_per_page' => 9,
    );
    
    $query   = new WP_Query( $args );
    $counter = 1;
    
    // Цикл.
    if ( $query->have_posts() ) {
    
    	echo '<div>';
    
    	while ( $query->have_posts() ) {
    		$query->the_post();
    
    		echo '<div>' . get_the_title() . '</div>';
    
    		if ( is_int( $counter / 3 ) ) {
    			echo '</div>';
    			echo '<div>';
    		}
    
    		$counter++;
    	}
    
    	echo '</div>';
    }
    else {
    	// Постов не найдено.
    }
    
    // Возвращаем оригинальные данные поста. Сбрасываем $post.
    wp_reset_postdata();
    Ответ написан
    1 комментарий
  • Как добавить одним разом много подкатегории в одну категорию?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Можете использовать этот пример. Для начала собираете простой массив ключ => значение с терминами, которые нужно опубликовать, получаете существующие термины get_terms(), в цикле простой проверкой in_array() проверяете существует ли такой термин в БД и при его отсутствии собираете набор аргументов и функцией для публикации на сайте с помощью wp_insert_category()

    // Массив терминов, которые нужно добавить.
    $brands = array(
    	'audi'     => 'Audi',
    	'bentley'  => 'Bentley',
    	'bmw'      => 'BMW',
    	'cadillac' => 'Cadillac',
    );
    
    $taxonomy        = 'car-brand'; // Основная таксономия.
    $category_parent = 12; // Родительская категория.
    
    // Получаем все термины таксономии.
    $args = array(
    	'taxonomy'   => $taxonomy,
    	'fields'     => 'id=>slug',
    	'hide_empty' => false,
    );
    $terms = get_terms( $args );
    
    foreach ( $brands as $brand_slug => $brand_title ) {
    	if ( ! in_array( $brand_slug, $terms, true ) ) {
    		$term_args = array(
    			'cat_name'             => $brand_title,
    			'category_description' => '',
    			'category_nicename'    => $brand_slug,
    			'category_parent'      => $category_parent,
    			'taxonomy'             => $taxonomy,
    		);
    		
    		$term_id = wp_insert_category( $term_args );
    
    		if ( is_wp_error( $term_id ) ) {
    			var_dump( 'Ошибка инсерта термина ' . $brand_title . ' таксономии ' . $taxonomy . ': ' . $term_id->get_error_message() );
    		} else {
    			var_dump( 'Термин ' . $brand_title . ' таксономии ' . $taxonomy . ' опубликован удачно!' );
    		}
    	}
    }
    Ответ написан
    Комментировать
  • Как реализовать отображение блока в шаблоне Wordpress при выполнении условия?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    <?php if ( category_description() ) { ?>
    	<div class="flex">
    		<div class="info">
    			<div class="block">
    			 <?php echo category_description(); ?>
    			</div>
    		</div>
    	</div>
    <?php } ?>
    Ответ написан
    2 комментария
  • Как вывести результат поиска списком предложениями?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    На странице с поиском у вас есть глобальный запрос постов из которого вы можете достать контент записей, распарсить их регулярками и вывести во фронт. Для подсветки слов можете использовать этот код

    if ( ! function_exists( 'wpgen_search_highlight' ) ) {
    
    	/**
    	 * Highlight search results.
    	 *
    	 * @param string $text is text for highlight.
    	 *
    	 * @return string
    	 */
    	function wpgen_search_highlight( $text ) {
    
    		$s = get_query_var( 's' );
    
    		if ( is_search() && in_the_loop() && ! empty( $s ) ) :
    
    			$style       = 'background-color:#307FE2;color:#fff;font-weight:bold;';
    			$query_terms = get_query_var( 'search_terms' );
    
    			if ( ! empty( $query_terms ) ) {
    				$query_terms = explode( ' ', $s );
    			}
    			if ( empty( $query_terms ) ) {
    				return '';
    			}
    
    			foreach ( $query_terms as $term ) {
    				$term  = preg_quote( $term, '/' ); // like in search string.
    				$term1 = mb_strtolower( $term ); // lowercase.
    				$term2 = mb_strtoupper( $term ); // uppercase.
    				$term3 = mb_convert_case( $term, MB_CASE_TITLE, 'UTF-8' ); // capitalise.
    				$term4 = mb_strtolower( mb_substr( $term, 0, 1 ) ) . mb_substr( $term2, 1 ); // first lowercase.
    				$text  = preg_replace( "@(?<!<|</)($term|$term1|$term2|$term3|$term4)@i", "<span style=\"{$style}\">$1</span>", $text );
    			}
    
    		endif; // is_search.
    
    		return $text;
    
    	}
    }
    add_filter( 'the_title', 'wpgen_search_highlight' );
    add_filter( 'the_content', 'wpgen_search_highlight' );
    add_filter( 'the_excerpt', 'wpgen_search_highlight' );
    Ответ написан
    1 комментарий
  • Как вносить изменения в тему WordPress, чтобы при ее обновлении изменения не сносились?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Для этого нужно использовать дочернюю тему
    Ответ написан
    1 комментарий
  • Как скрыть содержимое для пользователей с другой ролью?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    function is_user_role( $string ) {
    	if ( ! function_exists( 'wp_get_current_user' ) || ! is_user_logged_in() ) {
    		return 'unknown';
    	}
    	$user = wp_get_current_user();
    	return in_array( $string, (array) $user->roles, true );
    }
    
    if ( is_user_role( 'professional' ) ) {
    	# Вывод для авторизованного пользователя с ролью professional
    } else {
    	# Для всех остальных
    }
    Ответ написан
    Комментировать
  • Как сделать 2 домашние страницы?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    function is_user_role( $string ) {
    	if ( ! function_exists( 'wp_get_current_user' ) || ! is_user_logged_in() ) {
    		return 'unknown';
    	}
    	$user = wp_get_current_user();
    	return in_array( $string, (array) $user->roles, true );
    }
    
    if ( is_user_role( 'employer' ) ) {
    	# Вывод для авторизованного пользователя с ролью employer
    } else {
    	# Для всех остальных
    }
    Ответ написан
    Комментировать
  • Как изменить количество записей wordpress, зависимо от ширины экрана?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Серверный PHP ничего не знает о ширине экрана пользователя, поэтому отдаст столько записей, сколько вы запросите

    Можете получить 10 записей и, в зависимости от ширины экрана, скрывать лишние или можете получить 5 записей, а если ширина экрана больше 1000px, то ajax-запросом получить из БД еще

    Учитывайте, что оба варианта вызовут большие проблемы с пагинацией записей

    В WordPress есть функция wp_is_mobile(), которая проверяет переменную HTTP_USER_AGENT по ключевым словам на наличие мобильного устройства у пользователя, но на нее нельзя полагаться на 100%
    Ответ написан
  • Как полностью спрятать админку от пользователей subscriber?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    add_action( 'admin_init', 'restrict_admin_with_redirect', 1 );
    function restrict_admin_with_redirect() {
    
    	if ( is_user_logged_in() && is_admin() ) {
    		$user = wp_get_current_user();
    
    		if ( in_array( 'subscriber', $user->roles, true ) ) {
    			wp_safe_redirect( home_url(), 301 );
    		}
    	}
    }
    Ответ написан
  • Как фильтровать записи по меткам?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    В запросах вам нужно использовать аргумент tax_query

    $query = new WP_Query( array(
    	'post_type' => 'apartment',
    	'tax_query' => array(
    		array(
    			'taxonomy' => 'design',
    			'field'    => 'slug',
    			'terms'    => 'minimalism'
    		)
    	)
    ) );
    Ответ написан
    1 комментарий
  • Есть ли плагины Wordpress для привязки постов к карте?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Плагинов нет, но реализация не сложная. Для поста вам нужно поле с гео-координатами, можно сделать с помощью ACF или Carbon Fields. Далее выбираете api каких то карт, например яндекс карты, делаете запрос в базу, собираете и выводите по документации. Делал такое для горнолыжных курортов
    Ответ написан
    Комментировать
  • Как загрузить из functions.php сторонний скрипт php только на странице настроек Wordpess?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Файл никак. В файле вы вешаете функцию на хук, который срабатывает только в админке при загрузке кастомайзера

    /**
     * Add postMessage support for site title and description for the Theme Customizer.
     *
     * @param WP_Customize_Manager $wp_customize Theme Customizer object.
     */
    function wpgen_customize_register( $wp_customize ) {
    	//...
    }
    add_action( 'customize_register', 'wpgen_customize_register' );
    Ответ написан
  • Как добавить разное описание для разной карточки?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Для этого существует база данных — вы делаете запрос, получаете ответ, обрабатываете и выводите во фронт в нужном вам виде. В WordPress для этого существуют нативные функции, которые значительно упрощают вашу работу

    • the_title() — выводит заголовок записи
    • the_author() — выводит автора записи
    • the_content() — выводит контент записи
    • the_post_thumbnail() — выводит изображение записи
    Ответ написан
    Комментировать
  • Отложить загрузку плагина WP?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    PHP собирает HTML и отдает его браузеру клиента. Задерживать работу PHP нет никакого смысла, у клиента просто будет позже открываться сайт. У вас есть три варианта:

    • вынести парсер на сторону клиента
    • делать ajax-запрос на сервер
    • сохранять данные парсера в json/html и обновлять по условию
    Ответ написан
    Комментировать
  • Как из урл архивной страницы убрать slug таксономии?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Можно выкинуть плагин cptui и написать регистрацию таксономии руками с помощью функции register_taxonomy(), в нее вы можете передать все необходимые вам параметры
    Ответ написан
  • Как делать такие фильтры на wordpress?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    1. Регистрируете гет-переменные

    add_filter( 'query_vars', 'add_query_vars' );
    function add_query_vars( $qvars ) {
    
      $qvars[] = 'location';
      $qvars[] = 'from';
      $qvars[] = 'to';
      $qvars[] = 'type';
    
      return $qvars;
    }


    2. Собираете и выводите html-форму

    <form method="get" class="block obj-filter">
      <div class="row d-flex align-items-center">
        <div class="col-12 col-md-6 col-lg-3 col-margin-bottom-small col-lg-margin-bottom-none">
          <input type="text" name="location" id="location" class="obj-filter-input" value="">
        </div>
        <div class="col-12 col-md-6 col-lg-3 col-margin-bottom-small col-lg-margin-bottom-none">
          <input type="date" name="from" id="from" class="obj-filter-input" value="">
        </div>
        <div class="col-12 col-md-6 col-lg-3 col-margin-bottom-small col-lg-margin-bottom-none">
          <input type="date" name="to" id="to" class="obj-filter-input" value="">
        </div>
        <div class="col-12 col-md-6 col-lg-3 col-margin-bottom-small col-lg-margin-bottom-none">
          <select name="type" id="type" class="obj-select">
            <option value="solo">Один взрослый</option>
            <option value="two-adults">Два взрослых</option>
            <option value="family">Двое взрослых + ребенок</option>
          </select>
        </div>
        <div class="col-12 col-md-6 col-lg-3 col-margin-bottom-small col-lg-margin-bottom-none">
          <input id="obj-filter-submit" type="submit" class="button" value="Фильтровать">
        </div>
      </div>
    </form>


    3. При нажатии кнопки Фильтровать страница перезагружается, вы получаете ссылку такого вида

    https://example.loc/?location=yerevan&from=2807&to=0408&type=solo


    На хуке pre_get_posts можно поправить основной запрос вытянув данные из гет-параметров. Вам нужно установить новые tax_query или meta_query в зависимости от логики сайта

    add_action( 'pre_get_posts', 'custom_pre_get_posts', 1 );
    function custom_pre_get_posts( $query ) {
      // Выходим, если это админ-панель или не основной запрос.
      if ( is_admin() || ! $query->is_main_query() )
        return;
    
      // предположим, что это таксономия с машинами
      if ( $query->is_tax( 'location' ) ) {
        
        $meta = array();
        $meta['meta_query']['relation'] = 'AND';
    
        // выбираем записи с GET запросами
        $query_vars = array( 'location', 'from', 'to', 'type' );
        foreach ( $query_vars as $key => $query_var ) {
          if ( $var = get_query_var( $query_var, false ) ) {
            // Тут пишем логику по которой собирается переменная meta_query и/или tax_query
          }
        }
        $query->set( 'meta_query', $meta );
      }
    }
    Ответ написан
    Комментировать