• Как убрать картинки постов Wordpress по истечению времени?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Не обязательно делать крон, можно на хуке wp_head или template_redirect проверять is_single() и get_the_date(), в зависимости от этого изменять post_status, удалять изображение wp_delete_attachment() или даже удалить всю запись wp_delete_post() с 301 редиректом
    Ответ написан
    Комментировать
  • Плагин для валидации регионов и городов РФ либо выпадающий список woocommerce?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Плагин не подскажу, но есть DaData с необходимой вам базой данных
    Ответ написан
    1 комментарий
  • Как посчитать количество постов у автора?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    $user_id = get_current_user_id(); // Замените на ID пользователя, для которого вы хотите посчитать посты
    $post_count = count_user_posts( $user_id );
    Ответ написан
    Комментировать
  • Как сделать портфолио и указать команду работающая над ним?

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

    С помощью плагинов ACF или Carbon Fields можно сделать селект существующих команд при редактирования проекта или наоборот, при создании члена команды выбирать проект

    В post meta сохраняются IDs записей или таксономий, для последующего вывода необходимой информации

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

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

    https://example.loc/?tab=rent&type=townhouse&room=2


    На хуке pre_get_posts получаете get-переменные с помощью get_query_var() и $query->set() редактируете глобальный запрос

    Несколько раз подробно отвечал на подобные вопросы:



    Примеры по зависимости элементов формы ищите по запросу conditional form fields

    Ответ написан
    Комментировать
  • Как добваить данные из файла csv в таблицу wordpress через php?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Я пользуюсь библиотекой SimpleXLSX. Базовый пример:

    $file_import = get_stylesheet_directory() . '/data/baza.xlsx';
    
    if ( $xlsx = SimpleXLSX::parse( $file_import ) ) {
    	$excel = $xlsx->rows(0);
    
    	foreach ( $excel as $key_r => $excel_row ) {
    		// rows.
    		foreach	( $excel_row as $key_c => $excel_col ) {
    			// cols.
    		}
    	}
    }


    Кроме этого в WordPress есть встроенный импорт/экспорт, вы можете посмотреть и разобраться как он работает и сделать так же
    Ответ написан
  • Как не показывать когда его нет?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    <?php if ( $post->content ) { ?>
    	<div class="my">
    		<div class="content">
    			<?php the_content(); ?>
    		</div>
    	</div>
    <?php }
    Ответ написан
    2 комментария
  • Как на 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 комментария