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

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Если рассматривать ваш пример, то можно пытаться получить хотя бы один пост со значением publish_in = true в каждой таксономии

    $taxonomies = get_object_taxonomies( array( 'post_type' => $post_type ) );
    
    foreach( $taxonomies as $taxonomy )  {
    	
    	$terms = get_terms( $taxonomy );
    
    	foreach( $terms as $term ) {
    
    		$posts = get_posts(  array(
    			'post_type' => $post_type,
    			'posts_per_page' => 1,
    			'fields' => 'ids',
    			'tax_query' => array(
    				array(
    					'taxonomy' => $taxonomy,
    					'field' => 'slug',
    					'terms' => $term->slug,
    				)
    			),
    			'meta_query' => array(
    				array(
    					'key' => 'publish_in',
    					'value' => true,
    				),
    			),
    		) );
    
    		if ( is_array( $posts ) && count( $posts ) > 0 ) {
    			print_r( $term );
    		}
    
    	}
    }


    Но это плодит очень много запросов

    Можно на любом хуке до контента проверять наличие постов со значением publish_in = true, если находимся в категории и писать это в мету

    add_action( 'wp_head', 'category_publish_in_update' );
    function category_publish_in_update() {
    	
    	// выходим, если не категория
    	if ( !is_category() ) {
    		return;
    	}
    
    	// проверяем, что поле publish_in не обновлено
    	if ( !get_term_meta( get_queried_object()->term_id, 'publish_in', true ) ) {
    
    		// если находимся в категории, пытаемся получить хоть один пост с publish_in = true
    		$posts = get_posts( array(
    			'posts_per_page' => 1,
    			'cat' => get_queried_object()->term_id,
    			'fields' => 'ids',
    			'meta_query' => array(
    				array(
    					'key' => 'publish_in',
    					'value' => true,
    				),
    			),
    		) );
    
    		// если такой пост есть, записываем в мету категории publish_in = true
    		if ( is_array( $posts ) && count( $posts ) > 0 ) {
    			update_term_meta( get_queried_object()->term_id, 'publish_in', true );
    		}
    
    		// обновляем поле publish_in_update, чтобы не запускать функцию каждый раз
    		update_term_meta( get_queried_object()->term_id, 'publish_in_update', true );
    
    	}
    		
    }


    На хук обновления поста вешаем обновление обновление меты таксономии

    // обновляем поле publish_in_update при публикации записи
    add_action( 'save_post', 'custom_save_post', 25 );
    function custom_save_post( $post_id ) {
    
    	// проверяем, что это post и у него есть хотя бы одна категория
    	if ( get_post_type( $post_id ) === 'post' && has_term( '', 'category', $post_id ) ) {
    
    		foreach( get_the_terms( $post_id, 'category' ) as $category ) {
    			update_term_meta( $category->term_id, 'publish_in_update', false );
    		}
    
    	}
    
    }


    Теперь в запросе можно получить таксономии только с ключом publish_in true

    $taxonomies = get_object_taxonomies( array( 'post_type' => $post_type ) );
    
    $args = [
    	'taxonomy' => [ $taxonomies ],
    	'meta_query' => array(
    		array(
    			'key' => 'publish_in',
    			'value' => true,
    		),
    	),
    ];
    
    if ( $terms = get_terms( $args ) ) {
    	foreach( $terms as $term ){
    		print_r( $term );
    	}
    }


    PS. Писалось без тестов, что-то может не работать, а проверки вида is_category() нужно заменить на проверки вашей таксономии
    Ответ написан
    Комментировать
  • Как отредактировать страницу оформления заказа Woocommerce по макету?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Из сомнительных источников плагины лучше не скачивать, их не по доброте душевной выкладывают бесплатно. Тем более подобные плагины есть в официальном репозитории с фри-версией MultiStep Checkout for WooCommerce

    Вообще это называется step form, вы можете нагуглить готовые скрипты и раскидать в них поля чекаута, это не сложно

    Для платежей можно взять Яндекс.Кассу или плагин/API банка, в котором открыто юр.лицо заказчика

    PS. Эта работа стоит чуть больше, чем 5к
    Ответ написан
  • Contact form 7 валидация TEXT: как ограничить ввод цифр?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Комментировать
  • Как вывести записи с одного сайта на все в мультисайте?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    // переключаемся на ID основного сайта сети
    switch_to_blog( get_main_site_id() );
    
    // задаем нужные нам критерии выборки данных из БД
    $args = array(
    	'posts_per_page' => 6,
    	'post_type' => 'post',
    );
    
    $query = new WP_Query( $args );
    
    // Цикл
    if ( $query->have_posts() ) {
    	while ( $query->have_posts() ) {
    		$query->the_post();
    		echo '<h3>' . get_the_title() . '</h3>';
    	}
    } else {
    	// Постов не найдено
    }
    // Возвращаем оригинальные данные поста. Сбрасываем $post.
    wp_reset_postdata();
    
    // возвращемся к текущему блогу
    restore_current_blog();
    Ответ написан
    1 комментарий
  • Как вывести новости на сайт используя Wordpress?

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

    61c2b39e55022615583944.png

    Если же для главной страницы используется шаблон front-page.php или выбрана статическая страница, то там в глобальном запросе посты отсутствуют и вам необходимо будет написать код самостоятельно. Самый простой запрос wp_query() с выводом заголовков выглядит так:

    // задаем нужные нам критерии выборки данных из БД
    $args = array(
    	'posts_per_page' => 6,
    	'post_type' => 'post',
    );
    
    $query = new WP_Query( $args );
    
    // Цикл
    if ( $query->have_posts() ) {
    	while ( $query->have_posts() ) {
    		$query->the_post();
    		echo '<h3>' . get_the_title() . '</h3>';
    	}
    } else {
    	// Постов не найдено
    }
    // Возвращаем оригинальные данные поста. Сбрасываем $post.
    wp_reset_postdata();


    Чтобы добавить в запрос пагинацию, воспользуйтесь гайдом из этой статьи
    Ответ написан
    6 комментариев
  • Как реализовать такие характеристики товара?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Тут вы найдете формулу расчета расстояния между двумя географическими координатами на Земле: osiktakan.ru/geo_koor.htm

    А немного погуглив можно найти примеры кода на php


    Или js

    Ответ написан
    Комментировать
  • Как установить тег Н1 для категорий интернет магазина?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Шаблоны находятся в папке woocommerce/templates/, в каждом фале есть инструкция как его переопределить в дочерней теме. Так же в большинстве функций есть хуки и фильтры, лучше старайтесь переопределять части шаблонов через них
    Ответ написан
    Комментировать
  • Как сделать HTML карту меток на сайте WordPress?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    if ( $tags = get_tags() ) {
    	$html = '<ul class="post_tags">';
    
    	foreach ( $tags as $tag ) {
    		$html .= '<li>';
    			$html .= '<a href="' . get_tag_link( $tag->term_id ) . '" class="' . $tag->slug . '">' . $tag->name . '</a>';
    		$html .= '</li>';
    	}
    
    	$html .= '</ul>';
    
    	echo $html;
    }
    Ответ написан
    Комментировать
  • Как сделать пагинацию определенной категории?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Вам нельзя использовать query_posts(), это системная функция ядра, вы сломаете основной запрос. Чтобы его поправить используйте хук pre_get_posts

    add_action( 'pre_get_posts', 'set_front_page_category' );
    function set_front_page_category( $query ) {
    	if ( $query->is_front_page() && $query->is_main_query() ) {
    		$query->set( 'cat', '2' );
    	}
    }
    Ответ написан
    5 комментариев
  • Как создать страничку новостей на WordPress?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Для начала вам стоит ознакомиться с иерархией шаблонов. За вывод записи отвечает шаблон single.php, за вывод архивной страницы archive.php

    Если вывод верстки вашего типа записи или таксономии отличается от стандартного (заложенного в теме), то можете использовать более специфичные шаблоны, например single-{post-type}.php или taxonomy.php

    Для главной стоит использовать front-page.php, home.php или произвольный, если главная создана с помощью статической страницы. В index.php — базовый цикл

    Сразу же советую почитать про функции wp_query() и get_terms(), они нужны для запроса записей и терминов из базы для последующей обработки или вывода

    Для вывода вам понадобятся функции следующего вида:

    • the_title() — вывести заголовок
    • the_post_thumbnail() — вывести изображение записи
    • the_content() — вывести контент


    Остальные ищите по аналогии

    Так же я рекомендую посмотреть код дефолтных тем twenty или любых популярных. Делая похожим образом вы избежите множества проблем и ошибок. Кроме этого я рекомендую поставить плагин query monitor, он показывает стак загружаемых шаблонов и много другой полезной информации, которая поможет вам при разработке
    Ответ написан
    2 комментария
  • Как можно вывести поля с acf на другую страницу?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Функции get_field() и the_field() вторым параметром принимают id записи

    • get_field($selector, [$post_id], [$format_value]);
    • the_field($selector, [$post_id], [$format_value]);


    По умолчанию это id текущей записи в цикле, но вы можете передать туда любой id:

    • get_field( 'slogan_3img', 15 );
    • the_field( 'slogan_3img', 15 );


    Но лучше всего создать общий блок в с опциями темы, тогда вторым параметром в функциях указывается значение 'options'

    • get_field( 'slogan_3img', 'options' );
    • the_field( 'slogan_3img', 'options' );
    Ответ написан
    3 комментария
  • Разные шаблоны для подкатегорий wordpress?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Для таксономии используется шаблон taxonomy-{taxonomy}-{term}.php, слаг таксономии нужно подставить свой

    • taxonomy-{taxonomy}-pochta.php
    • taxonomy-{taxonomy}-bank.php
    • taxonomy-{taxonomy}-mfc.php


    А если вам нужно проверить принадлежность записи к какой-либо таксономии, воспользуйтесь проверкой has_term()

    if ( has_term( 'pochta', $taxonomy ) ) {
    	 // code
    }
    Ответ написан
    Комментировать
  • Как правильно добавить поля отзыва в админку WP при помощи wp_insert_comment?

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

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

    1. Объявить буфер вывода ob_start() и вернуть его с помощью ob_get_contents()

    function slider_shortcode_func( $atts ) { 
    	ob_start(); ?>
    	
    	<div class="slider">
    		<div class="slider-init">
    			<h2>Slider Content</h2>
    		</div>
    	</div>
    
    	<?php ob_get_contents();
    }
    add_shortcode( 'slider', 'slider_shortcode_func' );


    2. Собрать и вернуть переменную с помощью конкатенации строк

    function slider_shortcode_func( $atts ) { 
    
    	$html = '';
    
    	$html .= '<div class="slider">';
    		$html .= '<div class="slider-init">';
    			$html .= '<h2>Slider Content</h2>';
    		$html .= '</div>';
    	$html .= '</div>';
    
    	return $html;
    }
    add_shortcode( 'slider', 'slider_shortcode_func' );


    В этом случае функции the_field() нужно переписать в get_field()

    PS. Раз передаете в них ID $slider_post->ID, функция setup_postdata() не нужна

    PSS. Разумеется функция getSlider() должна возвращаться массив записей для работы, без нее ничего работать не будет
    Ответ написан
    Комментировать
  • Как вставить изображение в шапку сайта?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    if ( has_post_thumbnail() ) {
    	$background_image = get_the_post_thumbnail_url();
    } else {
    	$background_image = get_stylesheet_directory_uri() . '/assets/img/default.jpg';
    }
    
    echo '<section class="section first-screen" style="background: url(' . $background_image . ') center/cover no-repeat">';
    Ответ написан
  • Как создать вот такой список категории в Wordpress?

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

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    add_action( 'pre_get_posts', 'search_filter' );
    function search_filter( $query ){
    
    	if( ! is_admin() && $query->is_main_query() && $query->is_search ){
    		$query->set( 'post_type', 'post' );
    	}
    }
    Ответ написан
    Комментировать
  • Gutenberg стал как обычный редактор и не даёт добавлять блоки, что делать?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Попробуйте Ctrl+Shift+Alt+M

    61a63343b6c25536326520.png
    Ответ написан
  • Принцип, по которому можно такое реализовать?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Комментировать
  • Contact Form 7: как вывести в поле select названия произвольных типов записей?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    $tag = new WPCF7_FormTag( $tag );
    
    if ( empty( $tag->name ) ) {
    	return '';
    }
    
    $args = [
    	'post_type' => 'programs',
    	'post_status' => 'publish',
    	'posts_per_page' => -1,
    ];
    
    $html = '';
    $options = array();
    
    // пишем текущую запись в массив $options и исключаем из выборки get_posts()
    if ( is_single() && get_post_type() === 'programs' ) {
    	$args['post__not_in'][] = get_the_ID(),
    	$options[] = get_the_title();
    }
    
    // берем посты из базы
    if ( $posts = get_posts( $args ) ) {
    	foreach ( $posts as $key => $post ) {
    		$options[] = $post->post_title;
    	}
    }
    
    // собираем <select>
    if ( !empty( $options ) ) {
    	$html .= '<select name="' . $tag->name . '" id="' . $tag->name . '-options">';
    	foreach ( $options as $key => $option ) {
    		$html .= '<option value="' . esc_html( $option ) . '">' . esc_html( $option ) . '</option>';
    	}
    	$html .= '</select>';
    }
    
    return $html;
    Ответ написан