Ответы пользователя по тегу WordPress
  • Как сделать отдельную загрузку постов на ajax в табах?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    В ajax передаете нужный вам параметр, например post_type

    jQuery(document).ready(function ($) {
    
    	$('a.tab').on('click', function (e) {
    
    		$.ajax({
    			type: 'POST',
    			url: wpz_ajax_obj.ajaxurl, // Путь к файлу admin-ajax.php
    			data: {
    				'action': 'wpz_ajax_request', // Событие к которому будем обращаться
    				'post_type': $(e.currentTarget).attr('data-type'), // Передаём тип записи
    				'security': wplb_ajax_obj.nonce, // Используем nonce для защиты
    			}
    		})
    
    		e.preventDefault();
    
    	});
    });


    В php используете указанный параметр для запроса постов и возвращаете их функцией wp_send_json_success()

    function wpz_ajax_request() {
    
    	if ( isset( $_POST ) ) {
    
    		// Проверяем nonce, а в случае если что-то пошло не так, то прерываем выполнение функции
    		if ( !wp_verify_nonce( $_POST['security'], 'wpz-nonce' ) ) {
    			wp_die( 'Базовая защита не пройдена' );
    		}
    
    		// заказываем посты из базы
    		if ( isset( $_POST['post_type'] ) ) {
    
    			$args = array(
    				'post_type' => sanitize_text_field( $_POST['post_type'] ),
    				'posts_per_page' => 1,
    			);
    
    			$post_query = new WP_Query( $args );
    
    			if ( $post_query ) {
    				# если записи есть, возвращаем в wp_send_json_success() html-постов
    			} else {
    				# если записей нет, возвращаем в wp_send_json_success() информацию о том, что их нет
    			}
    
    		} else {
    			wp_send_json_error();
    		}
    
    	} // end if isset( $_POST )
    
    	wp_die();
    }


    PS. Желательно заранее проверять, что еще есть посты для загрузки, в противном случае скрывать кнопку их загрузки
    Ответ написан
  • Как создать динамический шаблон сразу для нескольких страниц?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Вы можете создать новый тип записи с помощью register_post_type() или Custom Post Type UI

    Для разных типов записи работают правила построения шаблонов:

    61e27e6c0fdda643902988.png

    Подробнее см. иерархию шаблонов wordpress
    Ответ написан
    Комментировать
  • Как вывести график работы индивидуально для каждой страницы?

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

    https://www.elegantthemes.com/blog/wordpress/wordp...

    Для вашей задачи 100% решение вы вряд ли найдете, код писать все равно придется

    От себя добавлю, что хорошие и удобные решения без десятка полей и чтобы данные в базу эргономично сохранялись мне не встречались, поэтому я в нескольких различных комбинациях сохранял простую строку в базу и разбирал ее регулярками при необходимости

    14:00 — 21:00; 11:00 — 21:00; 11:00 — 21:00; 11:00 — 21:00; 11:00 — 22:00; 09:00 — 22:00; 09:00 — 21:00


    mon="14:00 — 21:00" tue="11:00 — 21:00" wed="11:00 — 21:00" thu="11:00 — 21:00" fri="11:00 — 22:00" sat="09:00 — 22:00" sun="09:00 — 21:00"
    Ответ написан
  • Как массово обернуть ссылки в шорткод?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Могу посоветовать вам использовать любую библиотеку для парсинга html-тегов. Например, PHP Simple HTML DOM Parser

    Вот самый простой способ получить все ссылки

    $html = str_get_html( get_the_content() );
    
    $links = $html->find( 'a' );
    foreach ( $links as $key => $link ) {
    	var_dump( $link->href );
    }
    
    unset( $html );


    Обернуть в шорткоды можно с помощью метода

    $link->outertext = '[link]' . $link->outertext . '[/link]';


    Сохранить получившийся контент нужно с помощью wp_update_post()

    В целом, возможно есть и более простые решения, возможно вам удастся нагуглить даже плагины под вашу задачу или хотя бы похожие. Например, better search replace умеет менять все ссылки на сайте, а no external links преобразует все внешние ссылки во внутренние
    Ответ написан
    Комментировать
  • Условия по url для шаблона wp?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Есть условные теги is_single(), is_singular(), is_page() —используйте их для проверки где находитесь. Можно передавать id, slug, title и даже массив
    Ответ написан
    Комментировать
  • Как настроить поля ACF в WP?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Функция get_field() вторым параметром принимает $post_id — ID записи из которой брать данные

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

    Еще вы можете создать общую страницу с настройками сайта https://www.advancedcustomfields.com/resources/opt..., в этом случае вторым параметром передается значение option

    the_field( 'header_title', 'option' );
    Ответ написан
  • Как изменить H1 на странице значения атрибута?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Заголовок архивов выводится с помощью функции woocommerce_page_title() в файле archive-product.php, в этой функции есть одноименный фильтр. Вы можете изменить контент заголовка используя ACF, Carbon Fields или любую другую удобную вам логику

    add_filter( 'woocommerce_page_title', 'filter_function_name_7320' );
    function filter_function_name_7320( $page_title ){
    	// filter...
    
    	return $page_title;
    }
    Ответ написан
    Комментировать
  • Выдать права для пользователя на 7 дней?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Вряд ли из-за 15 строк кода кто-то будет писать настолько уникальный функционал

    // устанавливаем роль и дату начала тестового периода
    function set_user_test_period() {
    
    	$current_date = date( 'd-m-Y H:i:s' );
    
    	// пишем в мету юзера текущее время
    	add_user_meta( $user_id, '_test_period_start_date', $current_date, true );
    
    	$user = new WP_User( $user_id );
    
    	// добавляем роль участника
    	$user->add_role( 'contributor' );
    
    }
    
    
    // проверка завершения тестового периода
    function check_user_test_period() {
    
    	$current_date = date( 'd-m-Y H:i:s' );
    	$user_id = get_current_user_id();
    
    	$test_period_start_date = get_user_meta( $user_id, '_test_period_start_date', true );
    
    	$user = new WP_User( $user_id );
    
    	// проверяем, что текущая дата больше тестового периода
    	if ( strtotime( $current_date ) > strtotime( $test_period_start_date . ' + 7 days' ) ) {
    		// убираем роль участника
    		$user->remove_role( 'contributor' );
    	}
    
    }


    Писал без тестов, может что-то не работать и логику нужно доработать по необходимости
    Ответ написан
    2 комментария
  • Как решить проблему с мобильной версией?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Обратите внимание на аргумент $ver функций wp_enqueue_style() и wp_enqueue_script()

    wp_enqueue_style( $handle, $src, $deps, $ver, $media );
    wp_enqueue_script( $handle, $src, $deps, $ver, $in_footer );


    Это строка определяющая версию стилей и скриптов. Файл скачивается браузером, при следующей загрузке браузер сравнивает версию скриптов в html-файле с той, которая у него имеется в кеше и принимает решение загрузить новую или использовать ту, которая у него уже есть

    В этот параметр вы можете передавать время последнего изменения файла с помощью filemtime(), это гарантирует, что файл обновится в браузере при его изменении

    function custom_scripts_init() {
    
    	// common css
    	wp_enqueue_style( 'common-styles', get_theme_file_uri( 'assets/css/common.min.css' ) , array(), filemtime( get_theme_file_path( '/assets/css/common.min.css' ) ) );
    
    	// common js
    	wp_enqueue_script( 'common-scripts', get_theme_file_uri( 'assets/js/common.min.js' ), array( 'jquery' ), filemtime( get_theme_file_path( '/assets/js/common.min.js' ) ), true );
    
    }
    add_action( 'wp_enqueue_scripts', 'custom_scripts_init' );
    Ответ написан
    Комментировать
  • Как не оборачивать тег article в тег p?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    У вас не должно возникать такой ситуации в принципе, функция the_content() должна быть внутри тега <article>

    Фрагмент кода template-parts/content/content-single.php темы twentytwentyone:

    <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
    
    	<header class="entry-header alignwide">
    		<?php the_title( '<h1 class="entry-title">', '</h1>' ); ?>
    		<?php twenty_twenty_one_post_thumbnail(); ?>
    	</header>
    
    	<div class="entry-content">
    		<?php
    		the_content();
    
    		wp_link_pages(
    			array(
    				'before'   => '<nav class="page-links" aria-label="' . esc_attr__( 'Page', 'twentytwentyone' ) . '">',
    				'after'    => '</nav>',
    				/* translators: %: page number. */
    				'pagelink' => esc_html__( 'Page %', 'twentytwentyone' ),
    			)
    		);
    		?>
    	</div><!-- .entry-content -->
    
    	<footer class="entry-footer default-max-width">
    		<?php twenty_twenty_one_entry_meta_footer(); ?>
    	</footer><!-- .entry-footer -->
    
    	<?php if ( ! is_singular( 'attachment' ) ) : ?>
    		<?php get_template_part( 'template-parts/post/author-bio' ); ?>
    	<?php endif; ?>
    
    </article><!-- #post-<?php the_ID(); ?> -->
    Ответ написан
  • Как отфильтровать категории по значению кастомного поля в постах?

    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 комментария