Ответы пользователя по тегу WordPress
  • Как добавить свой класс body?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Есть фильтр body_class на котором вы можете добавить в массив собственные классы по условиям. Для решения вашей задачи, можете добавить post slug записи в список классов

    function theme_body_classes( $classes ) {
    
    	// Add hfeed class to non-singular pages.
    	if ( ! is_singular() ) {
    		$classes[] = 'hfeed';
    	}
    
    	// Check if site is being viewed from a mobile device.
    	if ( wp_is_mobile() ) {
    		$classes[] = 'wp-mobile';
    	} else {
    		$classes[] = 'wp-desktop';
    	}
    
    	// Add post slug to list of classes
    	if ( is_single() ) {
    		$classes[] = get_post_field( 'post_name', get_the_ID() );
    	}
    
    	return array_unique( (array) $classes );
    }
    add_filter( 'body_class', 'theme_body_classes' );
    Ответ написан
    3 комментария
  • Как при запросе страницы отобразить другую страницу?

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

    add_action( 'template_redirect', 'redirect_to_post_in_category' );
    function redirect_to_post_in_category() {
    
    	// Проверяем, что находимся в категории.
    	if ( is_category() ) {
    		$slugs = array();
    		$posts = get_posts();
    
    		// Собираем массив всех слагов постов.
    		foreach ( $posts as $key => $post ) {
    			$slugs[ $post->ID ] = $post->post_name;
    		}
    
    		// Проверяем, что слаг текущей категории есть в массиве постов.
    		if ( in_array( get_queried_object()->slug, $slugs, true ) ) {
    			$slugs   = array_flip( $slugs ); // Меняем местами ключи и значения в массиве постов.
    			$post_id = $slugs[ get_queried_object()->slug ]; // Ищем ID постав в массиве по слагу.
    			$url     = get_permalink( $post_id ); // Получаем url записи по ID.
    
    			// Если url существует — делаем редирект.
    			if ( $url ) {
    				wp_redirect( $url, 301 );
    			}
    		}
    	}
    }
    Ответ написан
    Комментировать
  • Как создать нестандартный цикл вывода постов WordPress?

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

    add_action( 'pre_get_posts', 'include_category_posts' );
    function include_category_posts( $query ) {
    	if ( $query->is_category() && get_queried_object()->count <= 6 ) {
    		$query->set( 'cat', '13' );
    	}
    }


    С помощью get_queried_object()->count вы получаете количество постов из категории и, если их меньше определенного количества, то добавляете в запрос посты из еще одной категории

    Так же вы можете написать чуть более сложную логику, посчитать сколько именно вам не хватает постов и добавить недостающие с помощью post__in

    $query->set( 'post__in', array( 5, 12, 2, 14, 7 ) );
    Ответ написан
    Комментировать
  • Как добавить 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() — выводит изображение записи
    Ответ написан
    Комментировать