• Как на WP сайте в темном режиме отображать картинки неизменно?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    html.darklooks-mode-changer-enabled img {
        filter: none !important;
    }
    Ответ написан
  • Есть вывод полей через acf в слайд, как сделать разный вывод изображений от размера экрана?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    php ничего не знает о размере экрана пользователя, но вы можете использовать функцию wp_is_mobile(), которая проверяет переменную $_SERVER['HTTP_USER_AGENT']. Она не всегда работает, есть фильтр через который ее можно расширить, добавив дополнительные проверки отсюда detectmobilebrowsers.com

    Так же вы можете добавить ссылки на оба изображения в дата-атрибуты и проверяя ширину экрана пользователя js-скриптом подставлять нужное значение в style
    Ответ написан
  • Как сделать выделение новой записи Wordpress?

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

    $current_date  = date( 'd-m-Y H:i:s' );
    $publish_date  = get_the_date( 'd-m-Y H:i:s' );
    $modified_date = get_the_modified_date( 'd-m-Y H:i:s' );
    
    if ( strtotime( $publish_date . ' + 1 day' ) > strtotime( $current_date ) ) {
    	echo '<div class="badge">' . __( 'New', 'themename' ) . '</div>';
    }


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

    Если на сайте используется длительное кеширование, то вывод .badge нужно переписывать либо на ajax-запросы, либо проверять через локальное время пользователя

    Например, выводите .badge с дата-атрибутом, проверяете на сколько оно отличается от времени пользователи и при необходимости убираете класс hidden

    echo '<div class="badge hidden" data-publish-date="' . esc_attr( get_the_date( 'd M Y H:i:s O' ) ) . '">' . __( 'New', 'themename' ) . '</div>';
    Ответ написан
    2 комментария
  • Как сделать шаблон для терма таксономии?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Все правильно, taxonomy-{taxonomy}-{term}.php должен работать
    Ответ написан
    Комментировать
  • Как правильно добавить произвольный PHP-код в functions.php в WordPress?

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

    global $wp;
    echo $wp->request;
    echo trailingslashit( home_url( $wp->request ) );
    Ответ написан
    Комментировать
  • Как сделать полную резервную копию всех пользователей?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Есть несколько плагинов для бэкапов, например BackWPup. Можно настроить бэкапы всего сайта, базы данных или отдельных таблиц. Разово или кроном по расписанию. Умеет делать копии в папку на сервере, FTP, email, dropbox и другие облачные хранилища
    Ответ написан
    Комментировать
  • Вопрос по выводу поля из ACF в Wordpress (удалить символ "+" в начале произвольного поля, где хранится телефон), как вывести?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Лучше вообще удалить из строки все НЕ числа регуляркой

    $phone = get_field( 'crm_telephone' );
    $phone = preg_replace( '/\D/', '', $phone );
    echo '<a href="tel:' . esc_attr( $phone ) . '">' . esc_html( get_field( 'crm_telephone' ) ) . '</a>';
    Ответ написан
    Комментировать
  • Как правильно добавить к мета-тегу robots атрибуты index, follow, noodp, noydir в WordPress?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Вы можете проверять существование ключей noindex или nofollow в массиве $robots

    /* Direktiva robots */
    function wporg_wp_robots_add_follow( $robots ) {
    	unset( $robots['max-image-preview'] );
    
    	if ( ! isset( $robots['noindex'] ) ) {
    		$robots['index']  = true;
    		$robots['follow'] = true;
    	}
    
    	$robots['noodp']  = true;
    	$robots['noydir'] = true;
    
    	return $robots;
    }
    add_filter( 'wp_robots', 'wporg_wp_robots_add_follow' );
    Ответ написан
    1 комментарий
  • Как изменить язык наполнения блока в Word Press?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Все текстовые строки темы доступные для перевода должны быть обернуты в функции __(), _e(), esc_html__(), esc_html_e() и подобные, после чего набор этих строк мижно будет перевести на любой язык используя плагин Polylang или десктопную программу Poedit
    Ответ написан
    Комментировать
  • Как смотреть 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, по которому в цикле можно вывести нужные элементы
    Ответ написан
    Комментировать