• Передать шорткод из functions php в html?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    $out = '';
    $out .= '<div class="main__item">';
    	$out .= do_shortcode( '[breadcrumb]' );
    	$out .= '<a href="' . get_permalink() . '" class="main__img">';
    		$out .= get_the_post_thumbnail();
    	$out .= '</a>';
    $out .= '</div>';
    $items[] = $out;
    Ответ написан
  • Есть ли подобный фильтр новостей на WP?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Из плагинов есть FacetWP и Search & Filter, но судя по скрину, мне кажется, вам придется писать кастомный функционал
    Ответ написан
    Комментировать
  • Как добавить класс костомному посту?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Вы можете создать массив $classes, добавлять в него слаги категорий, и выводить список с помощью implode()

    $query = new WP_Query( $args );
    
    if ( $query->have_posts() ) {
    	while ( $query->have_posts() ) {
    		$query->the_post();
    
    		$classes   = array();
    		$classes[] = 'projects__item';
    
    		if ( $categories = get_the_category() ) {
    			foreach ( $categories as $key => $category ) {
    				$classes[] = $category->slug;
    			}
    		}
    
    		echo '<li class="' . esc_attr( implode( ' ', $classes ) ) . '">' . get_the_title() . '</li>';
    
    	}
    }
    Ответ написан
    Комментировать
  • Как добавить свой класс 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 комментария
  • Можно так в YouTube Api?

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

    Не знаю на каком языке вы пишите, но вот вам упрощенный пример на php

    $args = array(
    	'q'           => 'Пример 1',
    	'order'       => 'date',
    	'part'        => 'snippet',
    	'maxResults'  => 50,
    	'key'         => wpgen_options( 'youtube_api_key' ),
    );
    
    if ( ! is_null( $page_token ) ) {
    	$args['pageToken'] = $page_token;
    }
    
    $api_url  = add_query_arg( $args, 'https://www.googleapis.com/youtube/v3/search' );
    $response = wp_remote_get( $api_url );
    Ответ написан
    Комментировать
  • Как вывести результат поиска списком предложениями?

    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 );
    		}
    	}
    }
    Ответ написан