Ответы пользователя по тегу WordPress
  • Прикрепить изображения к записи WP?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Если вы загружаете медиафайлы с использованием функции wp_insert_attachment(), то можете передать ID поста, к которому нужно прикрепить запись третьим параметром $parent_post_id

    wp_insert_attachment( $attachment, $filename, $parent_post_id, $wp_error, $fire_after_hooks );


    Проще всего прикрепить изображение к посту с помощью set_post_thumbnail(), первым параметром передаете ID записи, вторым ID медиафайла

    set_post_thumbnail( $post, $thumbnail_id );
    Ответ написан
    Комментировать
  • Как отобразить фотографии на странице из внутренней папки вместо медиабиблиотеки wp?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Можете использовать функцию scandir(), которая получает список файлов и каталогов, расположенных по указанному пути. Получаете файлы в указанном каталоге, выводите в нужной вам разметке по примеру

    $directory_uri = get_stylesheet_directory_uri() . '/data/nft/';
    $directory = get_stylesheet_directory() . '/data/nft/';
    
    echo '<div class="masonry-container">';
    	echo '<div class="row no-gutters masonry-gallery popup-gallery">';
    
    		foreach ( scandir( $directory ) as $key => $file_name ) {
    			if ( ! in_array( $file_name, ['.', '..'] ) && file_exists( $directory . $file_name ) ) {
    				echo '<a href="' . $directory_uri . $file_name . '" class="col-12 col-sm-6 col-lg-4 col-xl-3 masonry-item" title="#">';
    					echo '<img src="' . $directory_uri . $file_name . '" class="masonry-image" alt="#"/>';
    				echo '</a>';
    			}
    		}
    
    	echo '</div>';
    echo '</div>';
    Ответ написан
    Комментировать
  • Где найти код header-а темы Wordpress?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Функция onepress_header() находится в файле /inc/template-tags.php
    Ответ написан
    Комментировать
  • Как в wordpress скрыть элемент на странице для определенной группы пользователей?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Например, можно проверять текущий ник пользователя, если он авторизован
    if ( is_user_logged_in() ) {
    	$current_user = wp_get_current_user();
    
    	if ( in_array( $current_user->nickname, 'anubis', 'bast', 'ra', 'osiris' ) ) {
    		# code...
    	}
    
    }


    Если нужно проверять роль текущего пользователя, можно использовать этот пример

    function user_has_role( $user_id, $role_name ) {
    	$user_meta = get_userdata( $user_id );
    	$user_roles = $user_meta->roles;
    	return in_array( $role_name, $user_roles );
    }
    
    if ( is_user_logged_in() && user_has_role( get_current_user_id(), 'student' ) ) {
    	# code...
    }
    Ответ написан
  • Странное содержание robots в вордпрессе, такое нормально?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Скорее всего это стандартный robots.txt, который создается с помощью фильтра robots_txt. Управлять им можно следующим образом

    // Добавляем правила для файла robots.txt
    add_filter( 'robots_txt', 'wpgen_robots_txt', 20, 2 );
    function wpgen_robots_txt( $output, $public ) {
    
    	$output .= "Disallow: /wp-json\n";
    
    	return apply_filters( 'wpgen_robots_txt', $output, $public );
    }
    Ответ написан
    Комментировать
  • Как в wordpress вывести блок только в 1м посте(именно в посте)?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Проверку по ID можно сделать так

    if ( is_single() && get_the_ID() === 12 ) {
    	// code...
    }


    В цикле можно сделать проверку по номеру счетчика

    // задаем нужные нам критерии выборки данных из БД
    $args = array(
    	'posts_per_page' => 5,
    );
    
    $query = new WP_Query( $args );
    $i = 1;
    
    // Цикл
    if ( $query->have_posts() ) {
    	while ( $query->have_posts() ) {
    		$query->the_post();
    
    		if ( $i === 1 ) {
    			// блок перед первым постом
    		}
    
    		// выводим контент постов
    		the_title();
    
    		$i++;
    	}
    } else {
    	// постов не найдено
    }
    
    // возвращаем оригинальные данные поста. Сбрасываем $post
    wp_reset_postdata();
    Ответ написан
    Комментировать
  • Как правильно прописать, что бы блок выводился нескольким постам?

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

    if ( is_single() && in_array( get_the_ID(), [12, 13, 14] ) ) {
    	# code...
    }


    Для проверки по слагу записи так

    if ( is_single() && in_array( get_post_field( 'post_name' ), ['bmw', 'audi', 'nissan'] ) ) {
    	# code...
    }
    Ответ написан
    Комментировать
  • Как получить модерацию первого комментария?

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

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    $cats = array();
    
    foreach ( get_the_category() as $category ) {
    	$cats[] = $category->name;
    }
    
    if ( !empty( $cats ) && in_array( 'Соборы', $cats ) ) {
    	# выводим нужный блок
    }
    Ответ написан
    Комментировать
  • Как отфильтровать записи Wordpress внутри рубрики/метки по дате?

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

    Если у вас дата заполнена в полях ACF и вы хотите сделать запрос из базы исходя из этого параметра, то для этого используется параметр meta_key запроса wp_query()

    $posts = get_posts( array(
        'post_type' => 'event',
        'meta_key'  => 'date',
        'orderby'   => 'meta_value_num',
        'order'     => 'ASC',
    ));


    Если вы находитесь в шаблоне archive.php или подобном, то вам надо провести фильтрацию глобального запроса на хуке pre_get_posts

    add_action( 'pre_get_posts', 'pre_get_events', 1 );
    function pre_get_events( $query ) {
    	if ( $query->is_post_type_archive( 'event' ) ) {
    		$query->set( 'meta_key', 'date' );
    		$query->set( 'orderby', 'meta_value_num' );
    	}
    }


    Если же вам нужно сделать кастомную сортировку по двум и более параметрам, например, с помощью фронтенд формы, то без гет-параметров не обойтись. Возможны любые варианты:

    • мойсайт.ру/2022/05/10/?tag=arbuz
    • мойсайт.ру/tag/arbuz/?date=2022-05-10


    С помощью get_query_var() проверяете наличие переменной и меняете основной запрос

    add_action( 'pre_get_posts', 'custom_pre_get_posts', 1 );
    function custom_pre_get_posts( $query ) {
    	if ( $tag = get_query_var( 'tag', false ) ) {
    		$query->set( 'tag', $tag );
    	}
    }


    Если вы переживаете, что дублируются заголовки, то можете тем же самым способом с помощью get_query_var() проверять наличие переменной и подменять заголовок с описанием
    Ответ написан
    3 комментария
  • Условие для кастомной рубрики wp?

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

    1. Создать шаблон страницы руководствуясь иерархией шаблонов:

    • taxonomy-{taxonomy}.php
    • taxonomy-{taxonomy}-{term}.php


    2. Использовать проверку is_tax()

    // проверяем, что находимся в терминах audi и bmw таксономии product-category
    is_tax ( 'product-category', array( 'audi', 'bmw' ) ) {
    	
    }
    Ответ написан
    Комментировать
  • Как связать 2 таксономии?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Обычно это делается через гет-запросы. Например у вас ссылка /repair/?brand=rus, на хуке pre_get_posts проверяете таксономию и гет-переменную и фильтруете записи для вывода

    Для корректной работы переменную нужно зарегистрировать, если ее нет

    add_filter( 'query_vars', 'add_query_vars' );
    function add_query_vars( $qvars ) {
    	$qvars[] = 'brand';
    	return $qvars;
    }


    Добавить в ссылку гет-переменную можно с помощью функции add_query_arg()

    $link = add_query_arg( [ 'brand' => 'rus' ], $cur_link );


    Получить гет-запрос можно с помощью get_query_var() и отфильтровать по примеру

    add_action( 'pre_get_posts', 'filter_pre_get_posts', 1 );
    function filter_pre_get_posts( $query ) {
    
    	// Выходим, если это админ-панель или не основной запрос
    	if ( is_admin() || ! $query->is_main_query() ) {
    		return;
    	}
    
    	// Выбираем записи с GET запросами brand
    	if ( $query->is_tax( 'repair' ) && get_query_var( 'brand', false ) ) {
    		
    		$tax_query = [];
    
    		$tax_query['tax_query'][] = [
    			'taxonomy' => 'brands',
    			'field' => 'slug',
    			'terms' => get_query_var( 'brand', false ),
    		];
    
    		$query->set( 'tax_query', $tax_query );
    
    	}
    
    }
    Ответ написан
    4 комментария
  • Список адресов на карте по городам + wordpress?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Можно реализовать с помощью api яндекс карт, вот пример как добавлять множество меток. По такому же принципу можно сделать в mapbox и, возможно, в google maps

    В WordPress создаете у типа записи мета-поле geo_location, пишите в него широту/долготу, запросом wp_query() делаете выборку записей, собираете координаты в json по шаблону из документации и передаете скрипту карты на вывод
    Ответ написан
    2 комментария
  • Почему не считывается ID категории?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Потому что location-categories у вас это таксономия, а не категория и собирать ее нужно с помощью массива tax_query

    $args = [
    	'post_type' => 'location',
    	'orderby'   => 'name',
    	'order'     => 'ASC',
    	'tax_query' => [
    		'relation' => 'AND',
    		[
    			'taxonomy' => $category->taxonomy,
    			'field'    => 'id',
    			'terms'    => $category->term_id
    		]
    	]
    ];
    
    $locations = get_posts( $args );
    Ответ написан
    1 комментарий
  • Как записать путь до медиафайлов wordpress через php?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Есть нативная функция wp_upload_dir() для получения массива данных о папке с медиафайлами
    Ответ написан
    4 комментария
  • Как сделать синхронизацию публикаций в Wordpress multisite?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Функция switch_to_blog() позволяет переключается на указанный блог в системе мультисайтов. После переключения, любые запросы wp_query(), get_terms(), get_users() будут работать в рамках базы данных, на которую вы переключились

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


    Так же функцию можно использовать на хуках типа profile_update или save_post, чтобы сделать какие-то изменения на другом сайте в системе мультисайтов
    Ответ написан
    Комментировать
  • Как в Wordpress показывать пользователю только его страницы и записи?

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

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Дополню ответ Антон Литвиненко. Если у вас полностью кастомная верстка, то проще всего получить массив элементов с помощью wp_get_nav_menu_object() и вывести произвольным циклом. Получить можно по названию:

    $menu_name = 'Menu';
    $nav_menu = wp_get_nav_menu_object( $menu_name );
    
    if ( !$nav_menu ) {
    	$menu_id = wp_create_nav_menu( $menu_name );
    } else {
    	$menu_id = $nav_menu->term_id;
    }
    
    // получаем элементы меню
    $nav_menu_items = wp_get_nav_menu_items( $menu_id );


    По зарегистрированной локации:
    $menu_location = 'primary';
    $locations = get_nav_menu_locations();
    
    if ( isset( $locations[$menu_location] ) ) {
    	$nav_menu_items = wp_get_nav_menu_items( $locations[$menu_location] );
    }
    Ответ написан
    1 комментарий
  • Как запустить transition_post_status?

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

    add_action( 'save_post', 'custom_save_post' );
    function custom_save_post( $post_id ) {
    
    	// добавляем стартовое кол-во просмотров для всех публикуемых страниц
    	add_post_meta( $post_id, 'views', random_int(20, 50), true );
    	
    }
    Ответ написан
    1 комментарий
  • Что выполняет данная функция и как добавить условие?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Интересные у вас азы) Можно чуть сократить с помощью проверки текущего post_type в массиве

    add_action( 'transition_post_status', function ( $new_status, $old_status, $post ) {
    	if ( in_array( $post->post_type, ['post', 'event'] ) && 'publish' === $new_status ) {
    		delete_transient( self::$cache_filed );
    	}
    }, 10, 3 );
    Ответ написан
    2 комментария