• Как решить Fatal error: Uncaught Error: Call to undefined function pll_register_string()?

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

    function register_services_strings() {
    
    	if ( function_exists( 'pll_register_string' ) {
    		pll_register_string( 'Services', 'Услуги' );
    		pll_register_string( 'Service', 'Услуга' );
    	}
    
    }
    add_action( 'init', 'register_services_strings' );
    Ответ написан
    Комментировать
  • Как правильно выбрать файл шаблона в зависимости от урла?

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

    'has_archive' => 'books'
    'rewrite' => array( 'slug' => 'book' )


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

    Отображается по ссылке site.com/books/

    Для него действуют ряд специфичных функций, например is_post_type_archive()

    В иерархии шаблонов он будет иметь вид archive-{post_type}.php
    Ответ написан
    Комментировать
  • Как вывести кастомные категории и посты в цикле?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    У функции get_terms() нет аргумента post_type, а у WP_Query аргумента taxonomy

    Для проверки постов, относящихся к определенной категории нужно использовать get_the_terms() или has_term()

    <ul>
        <?php
        // Получаем все термины таксономии 'union'
        $cats = get_terms(array('taxonomy' => 'union', 'hide_empty' => false));
    
        // Цикл по терминам таксономии
        foreach ($cats as $cat) { ?>
        <li>
            <h2>
                <a href="<?php echo get_term_link($cat); ?>">
                    <?php echo get_field('eu-members') . '&nbsp;' . $cat->name . '&nbsp;<small>&#129122;&nbsp;' . get_field('eu-show-more') . '</small>' ?>
                </a>
            </h2>
    
            <ul>
                <?php
                // Создаем новый WP_Query для получения постов текущего термина
                $query_city = new WP_Query(array(
                    'posts_per_page' => -1,
                    'order' => 'ASC',
                    'post_type' => 'city',
                    'tax_query' => array(
                        array(
                            'taxonomy' => 'union', // Таксономия
                            'field' => 'term_id',  // Поле термина
                            'terms' => $cat->term_id, // ID термина
                        ),
                    ),
                ));
    
                // Проверяем наличие постов
                if ($query_city->have_posts()) {
                    while ($query_city->have_posts()) {
                        $query_city->the_post(); ?>
                        <li>
                            <figure><?php the_post_thumbnail(); ?></figure>
                            <div>
                                <span><?php the_title(); ?></span>
                            </div>
                        </li>
                    <?php }
                } else {
                    echo '<li>No posts found.</li>';
                }
    
                // Сбрасываем данные поста
                wp_reset_postdata();
                ?>
            </ul>
        </li>
        <?php } ?>
    </ul>
    Ответ написан
    1 комментарий
  • Как сортировать посты в get_posts по обычному и произольному полю?

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

    Вот рабочий пример загрузки сначала предстоящих мероприятий, потом прошедших

    $query->set( 'meta_query', array(
    	'relation'  => 'OR',
    	'actual'    => array(
    		'key'     => '_start_date',
    		'value'   => date( 'Y-m-d' ),
    		'compare' => '>=',
    		'type'    => 'DATE',
    	),
    	'completed' => array(
    		'key'     => '_start_date',
    		'value'   => date( 'Y-m-d' ),
    		'compare' => '<',
    		'type'    => 'DATE'
    	),
    ) );
    $query->set( 'orderby', array(
    	'actual'    => 'DESC',
    	'completed' => 'ASC',
    ) );
    Ответ написан
    Комментировать
  • Не подключается нужный файл архива, в чем может быть проблема?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Нужно вернуть 'has_archive' => true и пересохранить постоянные ссылки
    Ответ написан
    Комментировать
  • Как убрать стандартный title в Wordpress?

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

    if ( ! function_exists( 'pre_get_document_title_callback' ) ) {
    
    	/**
    	 * Function for `pre_get_document_title` filter-hook.
    	 * 
    	 * @param string $title The document title.
    	 *
    	 * @return string
    	 */
    	function pre_get_document_title_callback( $title ) {
    
    		if ( is_front_page() ) {
    			$title = 'Другой заголовок для главной';
    		}
    
    		return $title;
    	}
    }
    add_filter( 'pre_get_document_title', 'pre_get_document_title_callback' );
    Ответ написан
    Комментировать
  • Как вывести посты, свой тип записи нужной категории WordPress?

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

    <?php if ( have_posts() ) : ?>
    
    	<?php while ( have_posts() ) : ?>
    		<?php the_post(); ?>
    		<?php get_template_part( 'template-parts/content/content' ); ?>
    	<?php endwhile; ?>
    
    <?php else : ?>
    
    	<?php get_template_part( 'template-parts/content/content-none' ); ?>
    
    <?php endif; ?>
    Ответ написан
  • Как сделать перевод страницы типа записей, где выводятся все записи?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Если строка правильно зарегистрирована через функцию перевода, например

    __( 'Banner', 'domainname' );

    то перевод должен выводиться в зависимости от текущего языка независимо от polylang
    Ответ написан
    Комментировать
  • Как правильно создать категории на Wordpress?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Я бы зарегистрировал кастомный post type human и две таксономии к нему city и activity

    Как-то так:

    if ( ! function_exists( 'init_register_post_types_callback' ) ) {
    
    	/**
    	 * Function for 'init` action-hook.
    	 * 
    	 * @return void
    	 */
    	function init_register_post_types_callback() {
    
    		register_taxonomy( 'city', array( 'human' ), array(
    			'labels'            => array(
    				'name'                       => _x( 'Cities', 'taxonomy general name', 'domainname' ),
    				'singular_name'              => _x( 'City', 'taxonomy singular name', 'domainname' ),
    				'search_items'               => __( 'Search city', 'domainname' ),
    				'popular_items'              => __( 'Popular cities', 'domainname' ),
    				'all_items'                  => __( 'All cities', 'domainname' ),
    				'parent_item'                => null,
    				'parent_item_colon'          => null,
    				'edit_item'                  => __( 'Edit city', 'domainname' ),
    				'update_item'                => __( 'Update city', 'domainname' ),
    				'add_new_item'               => __( 'Add new city', 'domainname' ),
    				'new_item_name'              => __( 'New city', 'domainname' ),
    				'separate_items_with_commas' => __( 'Separate city with commas', 'domainname' ),
    				'add_or_remove_items'        => __( 'Add or remove city', 'domainname' ),
    				'choose_from_most_used'      => __( 'Choose from the most used cities', 'domainname' ),
    				'menu_name'                  => __( 'Cities', 'domainname' ),
    			),
    			'public'             => true,
    			'show_in_nav_menus'  => false,
    			'show_in_rest'       => true,
    			'show_in_quick_edit' => true,
    			'sort'               => true,
    			'show_tagcloud'      => false,
    			'hierarchical'       => true,
    			'rewrite'            => array( 'slug' => 'city', 'hierarchical' => false, 'with_front' => false, 'feed' => false ),
    			'show_admin_column'  => true,
    		) );
    
    		register_taxonomy( 'activity', array( 'human' ), array(
    			'labels'             => array(
    				'name'              => _x( 'Activities', 'taxonomy general name', 'domainname' ),
    				'singular_name'     => _x( 'Activity', 'taxonomy singular name', 'domainname' ),
    				'search_items'      => __( 'Search activities', 'domainname' ),
    				'all_items'         => __( 'All activities', 'domainname' ),
    				'parent_item'       => __( 'Parent activities', 'domainname' ),
    				'parent_item_colon' => __( 'Parent activities:', 'domainname' ),
    				'edit_item'         => __( 'Edit activities', 'domainname' ),
    				'update_item'       => __( 'Update activities', 'domainname' ),
    				'add_new_item'      => __( 'Add new activities', 'domainname' ),
    				'new_item_name'     => __( 'New activities Name', 'domainname' ),
    				'menu_name'         => __( 'Activities', 'domainname' ),
    			),
    			'public'             => true,
    			'show_in_nav_menus'  => false,
    			'show_in_rest'       => true,
    			'show_in_quick_edit' => true,
    			'sort'               => true,
    			'show_tagcloud'      => false,
    			'hierarchical'       => true,
    			'rewrite'            => array( 'slug' => 'activity', 'hierarchical' => false, 'with_front' => false, 'feed' => false ),
    			'show_admin_column'  => true,
    		) );
    
    		register_post_type( 'human', array(
    			'labels'          => array(
    				'name'               => __( 'Humans', 'domainname' ),
    				'singular_name'      => __( 'Human', 'domainname' ),
    				'add_new'            => __( 'Add human', 'domainname' ),
    				'add_new_item'       => __( 'Add new human', 'domainname' ),
    				'edit_item'          => __( 'Edit human', 'domainname' ),
    				'new_item'           => __( 'New human', 'domainname' ),
    				'view_item'          => __( 'View human', 'domainname' ),
    				'search_items'       => __( 'Search human', 'domainname' ),
    				'not_found'          => __( 'Human not found', 'domainname' ),
    				'not_found_in_trash' => __( 'Human not found in trash', 'domainname' ),
    				'menu_name'          => __( 'Human', 'domainname' ),
    			),
    			'public'          => true,
    			'show_in_rest'    => true,
    			'capability_type' => 'post',
    			'hierarchical'    => false,
    			'has_archive'     => 'humans',
    			'rewrite'         => array( 'slug' => 'humans', 'with_front' => false, 'pages' => true, 'feeds' => false, 'feed' => false ),
    			'query_var'       => true,
    			'supports'        => array( 'page-attributes', 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments', 'custom-fields' ),
    			'taxonomies'      => array( 'activities' ),
    		) );
    	}
    }
    add_action( 'init', 'init_register_post_types_callback' );
    Ответ написан
    Комментировать
  • Как преобразовать часовой пояс wordpress для таблицы User?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    date_i18n( 'F j, G:i', strtotime( $register_date . "+ 3 hours" ) )
    Ответ написан
    Комментировать
  • Как перенести Wordpress-проект на локальный сервер для дальнейшей ре-верстки?

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

    Если по какой-то причине он вам не подходит, вам нужно зайти в phpmyadmin, создать новую базу, импортировать в нее копию дампа и подключить в файле wp-config.php по аналогии с другими проектами

    /** The name of the database for WordPress */
    define( 'DB_NAME', 'db_name' );
    
    /** Database username */
    define( 'DB_USER', 'root' );
    
    /** Database password */
    define( 'DB_PASSWORD', '' );
    
    /** Database hostname */
    define( 'DB_HOST', 'localhost' );


    В качестве альтернативы OS порекомендую использовать Laragon, некоторые вещи в нем делаются проще, например, новый сайт на WP можно создать в два клика
    Ответ написан
    Комментировать
  • Wordpress - плагин или дочерняя тема для безопасного редактирования JS, CSS?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Какой способ, по вашему опыту, лучше?

    Изменения лучше вносить в дочерней теме через SFTP
    Ответ написан
    Комментировать
  • Как сделать автоматический выбор региона по IP в Wordpress?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Для яндекс карт есть определение местоположения по IP https://yandex.ru/dev/maps/jsbox/2.0/geolocation_ip
    Ответ написан
    Комментировать
  • Фатальная ошибка при отключении плагина Woocommerce на Wordpress. Как исправить?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Нужно проверять существование функции is_account_page() перед ее использованием, а лучше проверять активацию плагина is_plugin_active( 'woocommerce/woocommerce.php' ) или class_exists( 'WooCommerce' )
    Ответ написан
    4 комментария
  • Как поменять title на вордпессе?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Скорее всего это архив зарегистрированного типа записи и заголовок задается функцией register_post_type()

    Большинство SEO-плагинов умеют менять эти заголовки. Можете попробовать, например, Yoast
    Ответ написан
    Комментировать
  • Как вставить код в конкретное место страницы Вордпресса?

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

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    1. Функция has_term() проверяет наличие у поста терминов

    if ( has_term( '', 'post_tag' ) ) {
    	echo 'У текущей записи есть метки';
    }
    
    if ( has_term( 'triller', 'video' ) ) {
    	echo 'Запись имеет термин triller в таксономии video';
    }


    2. В функцию регистрации типа записи register_post_type() можно передать параметр rewrite в котором описать правила ЧПУ для этого типа записи. Свои правила перезаписи ссылок добавляются на фильтре post_type_link
    Ответ написан
    Комментировать
  • Как сделать переменное слово в заголовках и контенте мультисайта WP?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Расскажу как это работает у меня. Есть большая excel-таблица со списком городов и их склонениями. В customizer сделан селект с выбором города из столбца title, парсится таблица с помощью библиотеки SimpleXLSX

    Выбранный город со всеми склонениями сохраняется в wp_options, шорткод [city type="gde"] выводит нужный падеж

    66007ebf0fe1c474335268.png
    Ответ написан
    Комментировать
  • Раздные заголовки и ссылки на 1 пост?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Без проблем, в the_permalink() передаете ID поста, заголовки пишите сколько влезет

    <a href="<?php the_permalink( 12 ); ?>">5 правил выращивания огурцов</a>
    <a href="<?php the_permalink( 12 ); ?>">5 условий которые влияют на хороший урожай огурцов</a>
    Ответ написан
  • Как сделать сам отрывок записи ссылкой в wordpress?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    if ( $post_content === 'excerpt' ) { ?>
    	<a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><?php the_excerpt(); ?></a>
    <?php }
    Ответ написан
    Комментировать