Ответы пользователя по тегу WordPress
  • Woocommerce - использовать стандартные шаблоны или собирать новые через get_posts() и тд?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Лучше использовать вукомерсовские шаблоны, wc_get_products() или WC_Product_Query для запросов, так у вас меньше вероятность что-то сломать. И лучше смотреть код плагина и делать по аналогии
    Ответ написан
    Комментировать
  • Как поменять лого в подвале и как изменить title?

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


    По текстовому описанию вам никто не поможет. Смотрите документацию по теме, пишите тикет ее автору. Если тема бесплатная, проще посмотреть как все работает в файле footer.php

    хотя все настройки Yoast SEO выполнены правильно


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

    Ускорить это можно отправив на переобход нужных страниц в панели управления Яндекс Вебмастер и Google Search Console

    Кроме этого, если у вас добавлена карта сайта в эти панели управления, то поможет пересохранение записи — изменится параметр date-modified по которому поисковики понимают, что запись была обновлена и нужно ее переобойти
    Ответ написан
    Комментировать
  • Как интегрировать ChatGPT в WordPress?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Да, на сайте есть документация по API https://platform.openai.com/docs/guides/gpt

    Вот пример запроса и работы функции. 100% работу не гарантирую, т.к. несколько раз переписывал функцию, а у них выходят новые модели и изменения в запросах API, поэтому вам нужно будет все проверить и сделать настройки передаваемых аргументов под конкретную задачу

    if ( ! function_exists( 'get_chatgpt_responce' ) ) {
    
    	/**
    	 * Returns query result or error
    	 *
    	 * @param string $question Text API question.
    	 * @param string $promt    Text API promt (for chat).
    	 * @param string $model    API model.
    	 * @param string $api_key  API key.
    	 *
    	 * @return void
    	 */
    	function get_chatgpt_responce( $question = null, $promt = null, $model = 'gpt-3.5-turbo', $api_key = 'sk-le000000000000000000000000000000000000' ) {
    
    		if ( is_null( $question ) ) {
    			return null;
    		}
    
    		$type = 'text';
    
    		if ( $model === 'davinci-codex' ) {
    			$type = 'codex';
    		}
    
    		if ( in_array( $model, array( 'gpt-4', 'gpt-4-0314', 'gpt-4-32k', 'gpt-4-32k-0314', 'gpt-3.5-turbo', 'gpt-3.5-turbo-0301' ), true ) ) {
    			$type = 'chat';
    		}
    
    		$headers = "Content-Type: application/json\r\n" . "Authorization: Bearer " . $api_key . "\r\n";
    
    		$params = array(
    			'model'       => $model,
    			'temperature' => 0.7,
    			'top_p'       => 1,
    		);
    
    		if ( $type === 'chat' ) {
    			$url         = 'https://api.openai.com/v1/chat/completions';
    			$params['n'] = 1;
    			if ( ! is_null( $promt ) ) {
    				$params['messages'][] = array(
    					'role'    => 'system',
    					'content' => $promt,
    				);
    			}
    			$params['messages'][] = array(
    				'role'    => 'user',
    				'content' => $question,
    			);
    		} elseif( $type === 'codex' ) {
    			$url                  = 'https://api.openai.com/v1/engines/davinci-codex/completions';
    			$params['prompt']     = $question;
    			$params['max_tokens'] = 4096 - iconv_strlen( $question );
    		} else {
    			$url                  = 'https://api.openai.com/v1/completions';
    			$params['prompt']     = $question;
    			$params['max_tokens'] = 4096 - iconv_strlen( $question );
    		}
    
    		$args = array(
    			'method'       => 'POST',
    			'timeout'      => 240,
    			'redirection'  => 5,
    			'httpversion'  => '1.0',
    			'blocking'     => true,
    			'headers'      => $headers,
    			'body'         => json_encode( $params ),
    			'sslverify'    => true,
    		);
    
    		$response = wp_remote_request( $url, $args );
    
    		if ( is_wp_error( $response ) ) {
    			$notification = $response->get_error_message();
    		} elseif ( in_array( wp_remote_retrieve_response_code( $response ), array( 400, 401, 403, 404 ), true ) ) {
    			$body         = json_decode( wp_remote_retrieve_body( $response ), true );
    			$notification = $body['error']['message'];
    		} elseif ( wp_remote_retrieve_response_code( $response ) === 200 ) {
    			$body         = json_decode( wp_remote_retrieve_body( $response ), true );
    			$notification = 'Расход GPT токенов: ' . $body['usage']['total_tokens'] . '. Причина остановки: ' . $body['choices'][0]['finish_reason'];
    
    			if ( $type === 'chat' ) {
    				return $body['choices'][0]['message']['content'];
    			} else {
    				return $body['choices'][0]['text'];
    			}
    		}
    
    		if ( function_exists( 'telegram_notification' ) ) {
    			telegram_notification( $notification );
    		}
    
    		return false;
    	}
    }
    
    $query   = 'Write a list frequently asked questions about the get_the_title() WordPress function.';
    $chatgpt = get_chatgpt_responce( $query );
    var_dump( $chatgpt );
    Ответ написан
    Комментировать
  • Как отобразить единицу измерения после цены товара Woocommerce?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Потому что фильтр должен возвращать return, а не выводить echo

    add_filter( 'woocommerce_get_price_suffix', 'add_some_text_after_price', 99, 1 );
    
    function add_some_text_after_price ( $value ) {
    	$value = get_post_meta( get_the_ID(), '_edinica', true );
    
    	if ( empty( $value ) ) {
    		return;
    	}
    
    	return '<span>/ <span>' . esc_html( $value ) . '</span></span>';
    };
    Ответ написан
    1 комментарий
  • Как выводить в цикле wordpress несколько постов без дублирования?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    <?php
    
    $args = array(
    	'category'       => 4,
    	'orderby'        => 'date',
    	'posts_per_page' => 4,
    );
    
    $query = new WP_Query( $args );
    
    if ( $query->have_posts() ) {
    	while ( $query->have_posts() ) {
    		$query->the_post(); ?>
    
    		<div class="col-md-3 col-sm-3 col-xs-12 off-pd line-item">
    			<div class="prod-card">
    
    				<?php $tags = get_the_tags(); ?>
    				<?php if ( $tags ) { ?>
    					<ul class="tag-list">
    						<?php foreach ( $tags as $key => $tag ) { ?>
    							<li class="tag-list__item">
    								<a href="<?php echo get_tag_link( $tag->term_id ); ?>" class="product-tag"></a>
    							</li>
    						<?php } ?>
    					</ul>
    				<?php } ?>
    
    				<img src="<?php the_post_thumbnail_url( 'medium' ); ?>" class="product-img img-responsive" ></a>
    				<div class="product-discr">
    					<p class="product-h"><a href="<?php the_permalink(); ?>" rel="bookmark"><?php the_title(); ?></a></p>
    					<?php if ( get_field( 'short_diskr_post' ) ): ?>
    						<p class="product-short"><?php the_field( 'short_diskr_post' ); ?></p>
    					<?php endif; ?>
    				</div>
    			</div>
    		</div>
    
    		<?php
    	}
    }
    
    wp_reset_postdata();
    
    ?>
    Ответ написан
  • Как добавить дополнительный класс хедеру на определенных страницах?

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

    if ( ! function_exists( 'get_header_class' ) ) {
    
    	/**
    	 * Get classes for header container.
    	 *
    	 * @param string $class Additional header classes.
    	 *
    	 * @return array
    	 */
    	function get_header_class( $class = '' ) {
    
    		// Add elements to array.
    		$classes   = array();
    		$classes[] = 'header';
    
    		if ( has_custom_header() ) {
    			$classes[] = 'header_background-image';
    		}
    
    		if ( is_admin_bar_showing() ) {
    			$classes[] = 'is_wpadminbar';
    		}
    
    		if ( is_category( 'example' ) ) {
    			$classes[] = 'header_example';
    		}
    
    		// 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_header_class', $classes );
    		$classes = array_unique( (array) $classes );
    
    		return $classes;
    	}
    }
    
    if ( ! function_exists( 'header_class' ) ) {
    
    	/**
    	 * Display classes for header container.
    	 *
    	 * @param string $class Additional header classes.
    	 * @param bool   $echo  Echo or return header classes.
    	 *
    	 * @return string|void
    	 */
    	function header_class( $class = '', $echo = true ) {
    
    		$classes = get_header_class( $class );
    
    		if ( $echo ) {
    			echo 'class="' . esc_attr( implode( ' ', $classes ) ) . '"';
    		} else {
    			return 'class="' . esc_attr( implode( ' ', $classes ) ) . '"';
    		}
    	}
    }


    Использование:

    <header id="header" <?php header_class(); ?> aria-label="<?php _ex( 'Site header', 'aria-label', 'themename' ); ?>">
    	<!-- ... -->
    </header>
    Ответ написан
    Комментировать
  • Как сформировать безопасный запрос к базе WordPress?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    $args = array(
    	'posts_per_page' => -1,
    	'post_type'      => array( 'post', 'page', 'movie', 'book' ),
    	's'              => 'search phrase',
    );
    
    $query = new WP_Query( $args );
    Ответ написан
  • Как вывести количество записей в категории?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    global $wp_query;
    echo $wp_query->found_posts;
    Ответ написан
    Комментировать
  • Как создать свои переменные для мета тегов в плагине YOAST?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    function get_yoast_brand() {
    
    	$string = '';
    
    	if ( is_single() ) {
    		$string = get_post_meta( get_the_ID(), '_brand', true ) ?? __( 'Default Brand', 'textdomain' );
    	}
    
    	return $string;
    }
    
    // Define the action for register yoast_variable replacments.
    function register_custom_yoast_variables() {
    	wpseo_register_var_replacement( '%%Brand%%', 'get_yoast_brand', 'advanced', __( 'Description of this field', 'textdomain' ) );
    }
    
    // Add action.
    add_action( 'wpseo_register_extra_replacements', 'register_custom_yoast_variables' );
    Ответ написан
  • Поменять сортировку записей в RSS-ленте wordpress?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    function add_new_post_types_to_feed( $query ) {
    	if ( $query->is_feed ) {
    		$query->set( 'orderby', 'modified' );
    	}
    }
    add_filter( 'pre_get_posts', 'add_new_post_types_to_feed' );
    Ответ написан
    Комментировать
  • Бронирование через букинг ком?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Нужно использовать Booking API https://connect.booking.com/user_guide/site/en-US/...
    Ответ написан
    Комментировать
  • Темы вордпресс?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Курсор устанавливается css-свойством cursor, нет необходимости подключать для этого целую тему

    /* Keyword value */
    cursor: auto;
    cursor: pointer;
    /* … */
    cursor: zoom-out;
    
    /* URL with mandatory keyword fallback */
    cursor: url(hand.cur), pointer;
    
    /* URL and coordinates, with mandatory keyword fallback */
    cursor: url(cursor_1.png) 4 12, auto;
    cursor: url(cursor_2.png) 2 2, pointer;
    
    /* URLs and fallback URLs (some with coordinates), with mandatory keyword fallback */
    cursor: url(cursor_1.svg) 4 5, url(cursor_2.svg), /* … ,*/ url(cursor_n.cur) 5 5,
      progress;
    Ответ написан
    Комментировать
  • Как создать страницу для всех записей из Custom Post Type?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Для архивной страницы работает шаблон archive-{post_type}.php, т.е. в вашем случае archive-projects.php. Подробнее см. Иерархию шаблонов WP

    P.S. При регистрации post type логичнее называть его в единственном числе — project, а архивную страницу во множественном — projects
    Ответ написан
  • Как добавить в меню wordpress span в дочернем ul?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Семантически в <ul> нельзя вкладывать ничего, кроме элементов <li>, но если очень хочется, то вам нужно создать расширенный экземпляр класса Walker

    Если у вас совсем своя верстка, вы можете получить все элементы меню с помощью wp_get_nav_menu_items() и сделать вывод в свою верстку
    Ответ написан
    Комментировать
  • Как отсортировать комментарии / отзывы по языку?

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



    В comment meta сохраняете значение и делаете искомую сортировку на хуке pre_get_comments
    Ответ написан
    Комментировать
  • Как вставить переменную из шаблона в классический редактор WordPress?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    add_shortcode( 'wp_city', 'wp_city' );
    if ( ! function_exists( 'wp_city' ) ) {
    
    	/**
    	 * Add shortcode with city [wp_city city=""]
    	 *
    	 * @param array $atts shortcode attributes.
    	 *
    	 * @return string
    	 */
    	function wp_city( $atts ) {
    
    		// Define a white list of attributes.
    		$atts = shortcode_atts( array(
    			'city' => __( 'Moscow', 'default' ),
    		), $atts );
    
    		$output = '<span class="current-city">' . esc_html( $atts['city'] ) . '</span>';
    
    		return apply_filters( 'wp_city', $output );
    	}
    }
    Ответ написан
    7 комментариев
  • Как в wordpress сделать блок страницы динамическим, когда кеш включен?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Я в подобной ситуации в div секции дата-атрибута data-build-time пишу дату последней сборки, на js проверяю, если она просрочена, делаю ajax-запрос в бек, в ответе json вставляется в зависимости от контента
    Ответ написан
    2 комментария
  • Как создать страницу со списком карточек (типа портфолио или обяъявления) с поиском по тексту в вордпресс?

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

    Тип записи можно сделать непубличным с помощью аргумента public => false функции register_post_type(). У этой записи не будет ссылки во фронте, но будут все возможности редактирования в админке. Запросить записи для вывода во фронт можно произвольным запросом wp_query()
    Ответ написан
    2 комментария
  • Как убрать картинки постов 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 комментарий