• Как смотреть utm-метки на wordpress?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Get-параметры из ссылки вы можете получить с помощью функции get_query_var(). Еще немного информации о юзере вы можете получить из переменной $_SERVER — IP, geo, страну, язык, COOKIE, USER_AGENT (браузер пользователя)
    Ответ написан
    1 комментарий
  • Как подключить custom css к wordpress?

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

    function common_scripts() {
    	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' ) ) );
    
    	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', 'common_scripts' );


    Так же можно подключить стили инлайново с помощью wp_add_inline_style()

    function common_scripts() {
    	wp_enqueue_style( 'style', get_stylesheet_uri(), array(), filemtime( get_theme_file_path( '/style.css' ) ) );
    
    	$css = '
    		.breadcrumbs_yoast ul, .breadcrumbs_yoast ol {
    			padding: 0;
    			margin: 0;
    			list-style-type: none;
    		}
    
    		.breadcrumbs_yoast ul * , .breadcrumbs_yoast ol * {
    			vertical-align: top;
    		}
    
    		.breadcrumbs_yoast ul li, .breadcrumbs_yoast ol li {
    			display: inline-block;
    			margin-right: .25rem;
    		}
    
    		.breadcrumbs_yoast ul li:not(:first-child), .breadcrumbs_yoast ol li:not(:first-child) {
    			display: inline-block;
    			margin-left: .25rem;
    		}';
    
    	wp_add_inline_style( 'common-styles', $css );
    }
    add_action( 'wp_enqueue_scripts', 'common_scripts' );


    Если вам не нравится простыня стилей, то их можно минифицировать любой подходящей библиотекой с гитхаба

    Ответ написан
    Комментировать
  • Как использовать один header на всем проекте?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    У меня в проектах классы собираются следующим образом, сделано по аналогии с функциями body_class() и post_class()

    if ( ! function_exists( 'get_wpgen_header_classes' ) ) {
    
    	/**
    	 * Get classes for header container.
    	 *
    	 * @param string $class Additional header classes.
    	 *
    	 * @return array
    	 */
    	function get_wpgen_header_classes( $class = '' ) {
    
    		// Add elements to array.
    		$classes   = array();
    		$classes[] = 'header';
    
    		if ( has_custom_header() ) {
    			$classes[] = 'header--background-image';
    		}
    
    		if ( is_front_page() || is_home() ) {
    			$classes[] = 'header-bg';
    		} else {
    			$classes[] = 'custom-class';
    		}
    
    		// Check the function has accepted any classes.
    		if ( isset( $class ) && ! empty( $class ) ) {
    			if ( is_array( $class ) ) {
    				$classes = array_merge( $classes, $class );
    			} elseif ( is_string( $class ) ) {
    				$classes = array_merge( $classes, explode( ' ', $class ) );
    			}
    		}
    
    		$classes = apply_filters( 'get_wpgen_header_classes', $classes );
    
    		// Usage:
    		/*add_filter( 'get_wpgen_header_classes', 'my_header_classes' );
    		if ( ! function_exists( 'my_header_classes' ) ) {
    			function my_header_classes( $classes ) {
    				$classes[] = 'my-class';
    				return array_unique( $classes );
    			}
    		}*/
    
    		return array_unique( (array) $classes );
    	}
    }
    
    if ( ! function_exists( 'wpgen_header_classes' ) ) {
    
    	/**
    	 * Display classes for header container.
    	 *
    	 * @param string $class Additional header classes.
    	 * @param bool   $echo  Echo or return header classes.
    	 *
    	 * @return string
    	 */
    	function wpgen_header_classes( $class = '', $echo = true ) {
    
    		$classes = get_wpgen_header_classes( $class );
    
    		if ( $echo ) {
    			echo 'class="' . esc_attr( implode( ' ', $classes ) ) . '"';
    		} else {
    			return 'class="' . esc_attr( implode( ' ', $classes ) ) . '"';
    		}
    	}
    }


    Ваше условие я дописал в функцию, осталось дописать логику для ваших оставшихся 4 разных header-ов. В шаблоне функция используется так:

    <header id="header" <?php wpgen_header_classes(); ?>>


    Так же в функцию можно передавать классы строкой или массивом

    <header id="header" <?php wpgen_header_classes( 'new-class' ); ?>>
    Ответ написан
    Комментировать
  • Как правильно вывести строку через условные теги WordPress и условные операторы?

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

    $separator = '|';
    
    // Title prefixes.
    if ( is_post_type_archive() ) {
    	$title[] = _x( 'Archives:', 'post type archive title prefix', 'wpgen' );
    } elseif ( is_category() ) {
    	$title[] = _x( 'Category:', 'category archive title prefix', 'wpgen' );
    } elseif ( is_tag() ) {
    	$title[] = _x( 'Tag:', 'tag archive title prefix', 'wpgen' );
    } elseif ( is_author() ) {
    	$title[] = _x( 'Author:', 'author archive title prefix', 'wpgen' );
    } elseif ( is_date() ) {
    	if ( is_year() ) {
    		$title[] = _x( 'Year:', 'date archive title prefix', 'wpgen' );
    	} elseif ( is_month() ) {
    		$title[] = _x( 'Month:', 'date archive title prefix', 'wpgen' );
    	} elseif ( is_day() ) {
    		$title[] = _x( 'Day:', 'date archive title prefix', 'wpgen' );
    	}
    } elseif ( is_tax( 'post_format' ) ) {
    	if ( is_tax( 'post_format', 'post-format-aside' ) ) {
    		$title[] = _x( 'Asides', 'post format archive title', 'wpgen' );
    	} elseif ( is_tax( 'post_format', 'post-format-gallery' ) ) {
    		$title[] = _x( 'Galleries', 'post format archive title', 'wpgen' );
    	} elseif ( is_tax( 'post_format', 'post-format-image' ) ) {
    		$title[] = _x( 'Images', 'post format archive title', 'wpgen' );
    	} elseif ( is_tax( 'post_format', 'post-format-video' ) ) {
    		$title[] = _x( 'Videos', 'post format archive title', 'wpgen' );
    	} elseif ( is_tax( 'post_format', 'post-format-quote' ) ) {
    		$title[] = _x( 'Quotes', 'post format archive title', 'wpgen' );
    	} elseif ( is_tax( 'post_format', 'post-format-link' ) ) {
    		$title[] = _x( 'Links', 'post format archive title', 'wpgen' );
    	} elseif ( is_tax( 'post_format', 'post-format-status' ) ) {
    		$title[] = _x( 'Statuses', 'post format archive title', 'wpgen' );
    	} elseif ( is_tax( 'post_format', 'post-format-audio' ) ) {
    		$title[] = _x( 'Audio', 'post format archive title', 'wpgen' );
    	} elseif ( is_tax( 'post_format', 'post-format-chat' ) ) {
    		$title[] = _x( 'Chats', 'post format archive title', 'wpgen' );
    	}
    }
    
    // Main title.
    if ( is_single() || is_page() ) {
    	$title[] = get_the_title();
    } elseif ( is_404() ) {
    	$title[] = __( 'Page not found', 'wpgen' );
    } elseif ( is_search() ) {
    	$title[] = sprintf( __( 'Search Results for &#8220;%s&#8221;', 'wpgen' ), get_search_query( false ) );
    } elseif ( is_post_type_archive() ) {
    	$title[] = get_queried_object()->label;
    } elseif ( is_author() ) {
    	$title[] = get_queried_object()->display_name ?? '';
    } elseif ( is_date() ) {
    	if ( is_year() ) {
    		$title[]  = get_the_date( 'Y' );
    	} elseif ( is_month() ) {
    		$title[]  = get_the_date( 'F Y' );
    	} elseif ( is_day() ) {
    		$title[]  = get_the_date( 'F j, Y' );
    	}
    } elseif ( is_archive() ) {
    	$title[] = get_queried_object()->name;
    }
    
    // Add site info in the title.
    if ( ! isset( $title ) ) {
    	$title[] = get_bloginfo( 'name' );
    	$title[] = $separator;
    	$title[] = get_bloginfo( 'description' );
    } else {
    
    	if ( is_paged() ) {
    		$title[] = $separator;
    		$title[] = __( 'Page', 'wpgen' ) . ' ' . $paged;
    	}
    
    	$title[] = $separator;
    	$title[] = get_bloginfo( 'name' );
    }
    
    $title = implode( ' ', $title );
    Ответ написан
    4 комментария
  • Как натянуть уже сверстанное меню на WordPress?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Самый простой вариант — получить массив элементов меню с помощью функции 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 ] );
    }
    Ответ написан
    6 комментариев
  • Картинки не отображаються после переноса?

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

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

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Для перевода текстовых строк в теме используются функции __(), _e(), esc_html__(), esc_html_e(), _x() и _ex()

    _x( 'Read', 'past participle: books I have read', 'text_domain' );


    В text_domain указывается идентификатор файла перевода установленный функцией load_theme_textdomain()

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

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Лично я стандартные записи использую только для новостей и статей, а услуги, эвенты и другие, обособленные типы контента регистрирую с помощью register_post_type() и register_taxonomy()

    На архивной странице archive.php посты выводятся с подключением шаблонов вида

    get_template_part( 'templates/archive/post', get_post_type() );


    Т.е. WP пытается использовать файлы post-service.php или post-event.phpб а при их отсутствии подключает базовый post.php

    Для изменения шаблона архивной страницы нужно создать в корне файл taxonomy-{taxonomy}.php или archive-{post_type}.php в зависимости что вам нужно, подробнее в смотрите иерархию шаблонов

    Глобальный запрос постов находится в global $wp_query, если его нужно отфильтровать, то используйте хук pre_get_posts

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

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Вы можете получить массив объектов меню с помощью wp_get_nav_menu_items() по переданному ID или location

    // Получаем элементы меню по 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 ] );
    }


    В объектах есть параметр menu_item_parent, по которому в цикле можно вывести нужные элементы
    Ответ написан
    Комментировать
  • Как ислючить заголовки подрубрик?

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

    if ( $cat->parent === 0 ) {
    	# родительская категория.
    } else {
    	# дочерняя категория.
    }
    Ответ написан
    3 комментария
  • Как скрыть или запретить смотреть статьи по дате в Wordpress?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Вы можете изменить основной запрос на хуке pre_get_posts. Используйте проверки is_date(), is_year(), is_month() и is_day()

    Так же вы всегда можете сделать нужные вам редиректы на хуке template_redirect с теми же проверками

    PS. Сомневаюсь, что вам это поможет, т.к. даты публикации/обновления записей есть в xml-карте сайта
    Ответ написан
    Комментировать
  • Из-за чего может не работать список?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Из-за чего на сайте могут не работать переходы между городами в шапке?


    Из-за ошибки в скрипте

    6397736e030c2913256843.png
    63977373e001c047019558.png
    Ответ написан
    1 комментарий
  • Как подключить сайт к xml формату Яндекс.Недвижимость на Wordpress без Woocommerce?

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

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

    function get_yoast_custom_title() {
    
    	if ( is_single() ) {
    		$string = get_the_title();
    	} else {
    		$string = 'Заголовок по умолчанию';
    	}
    
    	return $string;
    }
    
    
    // Define the action for register yoast_variable replacments.
    function register_custom_yoast_variables() {
    	wpseo_register_var_replacement( '%%CustomTitle%%', 'get_yoast_custom_title', 'advanced', __( 'Some instead title text', 'wpgen' ) );
    }
    
    // Add action.
    add_action( 'wpseo_register_extra_replacements', 'register_custom_yoast_variables' );


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

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    function get_category_post_count() {
    
    	$string = '';
    
    	if ( is_category() && isset( get_queried_object()->count ) ) {
    		$string = get_queried_object()->count;
    	}
    
    	return $string;
    }
    
    
    // Define the action for register yoast_variable replacments.
    function register_custom_yoast_variables() {
    	wpseo_register_var_replacement( '%%PostCount%%', 'get_category_post_count', 'advanced', __( 'Some instead title text', 'wpgen' ) );
    }
    
    // Add action.
    add_action( 'wpseo_register_extra_replacements', 'register_custom_yoast_variables' );
    Ответ написан
    3 комментария
  • Каким плагином можно из Excel сделать сайт на Wordpress?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Скорее всего вы ищите плагин WP All Import, но он платный. Для конвертации .xlsx файлов в массив есть неплохая библиотека SimpleXLSX
    Ответ написан
    Комментировать
  • Wordpress - Как реализовать изображения под Retina?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Есть плагин Perfect Images, который создает нужные размеры, файлы изображений, а так же добавляет их в вывод функций. Вы можете его установить и использовать или разобраться в его коде
    Ответ написан
    Комментировать
  • Taxonomy, как сделать одинаковый slug?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Я бы при регистрации типа записи с помощью функции register_post_type() указал аргумент 'has_archive' => 'repetitors', это общий архив для всех записей этого типа. Так же вам будет достаточно регистрации одной таксономии

    add_action( 'init', 'education_register_post_type' );
    function education_register_post_type() {
    
    	// Taxonomy repetitor_cat.
    	register_taxonomy( 'repetitor_cat', array( 'repetitor' ), array(
    		'labels'             => array(
    			'name'              => _x( 'Repetitor category', 'taxonomy general name', 'education' ),
    			'singular_name'     => _x( 'Repetitor categories', 'taxonomy singular name', 'education' ),
    			'search_items'      => __( 'Search Repetitor category', 'education' ),
    			'popular_items'     => __( 'Popular Repetitor category', 'education' ),
    			'all_items'         => __( 'All Repetitor categories', 'education' ),
    			'parent_item'       => null,
    			'parent_item_colon' => null,
    			'edit_item'         => __( 'Edit Repetitor category', 'education' ),
    			'update_item'       => __( 'Update Repetitor category', 'education' ),
    			'add_new_item'      => __( 'Add new Repetitor category', 'education' ),
    			'new_item_name'     => __( 'New Repetitor category name', 'education' ),
    			'menu_name'         => __( 'Repetitor categories', 'education' ),
    		),
    		'public'             => true,
    		'show_tagcloud'      => true,
    		'hierarchical'       => false,
    		'query_var'          => true,
    		'show_in_quick_edit' => true,
    		'sort'               => true,
    	) );
    
    	// Post type repetitor.
    	register_post_type( 'repetitor', array(
    		'labels'          => array(
    			'name'               => __( 'Repetitors', 'education' ),
    			'singular_name'      => __( 'Repetitor', 'education' ),
    			'add_new'            => __( 'Add Repetitor', 'education' ),
    			'add_new_item'       => __( 'Add new Repetitor', 'education' ),
    			'edit_item'          => __( 'Edit Repetitor', 'education' ),
    			'new_item'           => __( 'New Repetitor', 'education' ),
    			'view_item'          => __( 'View Repetitor', 'education' ),
    			'search_items'       => __( 'Search Repetitor', 'education' ),
    			'not_found'          => __( 'Repetitor not found', 'education' ),
    			'not_found_in_trash' => __( 'Repetitor not found in trash', 'education' ),
    			'menu_name'          => __( 'Repetitors', 'education' ),
    		),
    		'public'          => true,
    		'show_in_rest'    => true, // Включает Gutenberg.
    		'capability_type' => 'post',
    		'hierarchical'    => false,
    		'has_archive'     => 'repetitors',
    		'rewrite'         => array( 'slug' => 'repetitors', '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( 'repetitor_cat' ),
    	) );
    }


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