Ответы пользователя по тегу WordPress
  • Как сделать автоматический выбор региона по 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 }
    Ответ написан
    Комментировать
  • Как добавить третье условие в коде?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    if ( is_front_page() && count( $posts ) > 0 && get_queried_object_id() === 320 ) {
    	// code...
    }
    Ответ написан
    Комментировать
  • Как добавить, изменить или удалить те или иные элементы относительно формата поста Wordpress?

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

    add_filter( 'excerpt_length', function() {
    
    	global $post;
    
    	$length = 55;
    
    	if ( get_post_format( $post->ID ) === 'image' ) {
    		$length = 10;
    	}
    
    	return $length;
    } );
    Ответ написан
    1 комментарий
  • Как отключить вывод стандартного метатега тайтл в 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_home() || is_front_page() ) {
    			$title = get_field( 'home_page_title' );
    		}
    		if ( is_single() ) { 
    			$title = get_field( 'home_page_title' );
    		}
    		if ( is_category() ) { 
    			$title = get_field( 'home_page_title' );
    		}
    		if ( is_page( 16 ) ) {
    			$title = get_field( 'download_title' ); 
    		}
    		if ( is_page( 18 ) ) {
    			$title = get_field( 'faq_page_title' );
    		}
    
    		return $title;
    	}
    }
    add_filter( 'pre_get_document_title', 'pre_get_document_title_callback' );
    Ответ написан
    Комментировать
  • Как вывести записи текущего термина произвольной таксономии WordPress?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Записи текущего термина произвольной таксономии уже находятся в global $wp_query->posts, вам не нужно создавать свой собственный экземпляр запроса WP_Query()
    Ответ написан
    Комментировать
  • Почему при добавлении изображения в виджете wordpress дважды вызывается медиатека?

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

    jQuery( document ).ready( function ( $ ) {
    
    	function mediaUploader( buttonClass ) {
    
    		// Trigger the Media Uploader dialog.
    		$( document ).on( 'click', buttonClass, function( e ) {
    
    			var mediaUploader;
    				form = $( buttonClass ).closest( 'form' )
    
    			// If the uploader object has already been created, reopen the dialog.
    			if ( mediaUploader ) {
    				mediaUploader.open();
    				return;
    			}
    
    			 // Extend the wp.media object.
    			var mediaUploader = wp.media.frames.file_frame = wp.media( {
    				title: 'Select Image',
    				button: {
    					text: 'Select Image'
    				},
    				multiple: false,
    				library: {
    					type: 'image'
    				},
    			} );
    
    			// When a file is selected, grab the URL and set it as the text field's value.
    			mediaUploader.on( 'select', function () {
    				var attachment = mediaUploader.state().get( 'selection' ).first().toJSON();
    
    				form.find( '.image-upload' ).val( attachment.url );
    				form.find( '.media-image-container' ).empty();
    				form.find( '.media-image-container' ).append( '<img src="' + attachment.url + '" class="media-image" alt="Image Preview" style="max-width:100%;margin-bottom:10px" />' );
    
    				$( '.media-modal:visible' ).find( '.media-modal-close' ).trigger( 'click' );
    			} );
    
    			// Open the uploader dialog.
    			mediaUploader.open();
    		} );
    	}
    
    	// Initialize media uploader.
    	mediaUploader( '.button-add-adv-media' );
    } );


    Код вывода формы написан на основе файла woocommerce/includes/abstracts/abstract-wc-widget.php

    <?php case 'image':
    	?>
    	<div class="media-widget-control">
    		<p>
    			<label for="<?php echo esc_attr( $this->get_field_id( $key ) ); ?>"><?php echo wp_kses_post( $setting['label'] ); ?></label><?php // phpcs:ignore WordPress.XSS.EscapeOutput.OutputNotEscaped ?>
    			<input class="widefat image-upload <?php echo esc_attr( $class ); ?>" id="<?php echo esc_attr( $this->get_field_id( $key ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( $key ) ); ?>" type="hidden" value="<?php echo esc_attr( $value ); ?>" />
    		</p>
    
    		<div class="media-widget-preview">
    			<div class="media-image-container">
    				<?php if ( ! empty( $value ) ) : ?>
    					<img src="<?php echo esc_url( $value ) ; ?>" alt="Image Preview" style="max-width:100%;margin-bottom:10px" />
    				<?php endif; ?>
    			</div>
    
    			<div class="attachment-media-view">
    				<button type="button" class="select-media button-add-media button-add-adv-media not-selected"><?php esc_html_e( 'Add image', 'aesthetix' ); ?></button>
    			</div>
    		</div>
    
    		<?php if ( isset( $setting['desc'] ) ) : ?>
    			<small><?php echo esc_html( $setting['desc'] ); ?></small>
    		<?php endif; ?>
    
    	</div>
    	<?php
    	break;
    Ответ написан
    1 комментарий
  • Как передать метку на карту по координатам из админки?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Тоже решал подобную проблему, в итоге решил собирать весь скрипт на php. Сначала собираю обычный массив, как в документации object_manager

    $mask         = array();
    $mask['type'] = 'FeatureCollection';
    
    foreach ( $resorts as $key => $resort ) {
    
    	$geo_point = get_post_meta( $resort->ID, '_geo_location', true );
    	$geo_point = explode( ',', $geo_point );
    
    	// Собираем php массив для карты, который энкодим в json формат
    	$mask['features'][] = array(
    		'type'       => 'Feature',
    		'id'         => $key,
    		'geometry'   => array (
    			'type'        => 'Point',
    			'coordinates' => [(float) trim($geo_point[0]), (float) trim($geo_point[1])],
    		),
    		'properties' => array (
    			'balloonContentBody' => '<strong class="balloon-title"><a class="link" href="' . esc_url( get_the_permalink( $resort->ID ) ) . '" target="_blank">' . $resort->post_title . '</a></strong>',
    			'clusterCaption'     => '<strong>' . $resort->post_title . '</strong>',
    			'hintContent'        => '<strong>' . $resort->post_title . '</strong>'
    		)
    	);
    }


    С помощью json_encode() и wp_add_inline_script() вставляю все во фронт

    $frontend_scripts = "<script type='text/javascript'>
    
    	jQuery(function($){
    
    		ymaps.ready(init);
    
    		function init () {
    			var map = new ymaps.Map('ya-map', {
    					center: [55.76, 37.64],
    					zoom: 4,
    					controls: ['geolocationControl' ,'zoomControl'],
    				}, {
    					avoidFractionalZoom: false,
    				});
    				
    			map.behaviors.disable(\"scrollZoom\");
    
    			var objectManager = new ymaps.ObjectManager({
    				clusterize: true,
    				gridSize: 32,
    				clusterDisableClickZoom: true
    			});
    
    			objectManager.objects.options.set( 'preset', 'islands#greenCircleDotIcon' );
    			objectManager.clusters.options.set( 'preset', 'islands#greenClusterIcons' );
    
    			map.geoObjects.add(objectManager);
    
    			var pointLabels = " . json_encode( $mask ) . ";
    			objectManager.add(pointLabels);
    
    			// эта костыльная хуйня центрирует карту и делает автозум, чтобы попали все точки
    			var geoObjects = ymaps.geoQuery(pointLabels)
    				.applyBoundsToMap(map, {
    					checkZoomRange: true
    				});
    
    		}
    
    	});
    
    </script>";
    
    wp_add_inline_script( 'main', minify_js( $frontend_scripts ) );
    Ответ написан
  • Как вывести список городов и областей на WordPress?

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

    if ( ! function_exists( 'get_converter_wp_cities' ) ) {
    
    	/**
    	 * Return string or array with wp cities.
    	 *
    	 * @param string $control Key to get one value. Optional. Default null.
    	 *
    	 * @return string|array|false
    	 */
    	function get_converter_wp_cities( $control = null ) {
    
    		// Sanitize string (just to be safe).
    		if ( ! is_null( $control ) ) {
    			$control = get_title_slug( $control );
    		}
    
    		// Main converter array.
    		$converter = array(
    			'moscow'           => 'Москва',
    			'saint-petersburg' => 'Санкт-Петербург',
    			'novosibirsk'      => 'Новосибирск',
    		);
    
    		$converter = apply_filters( 'get_converter_wp_cities', $converter );
    
    		// Return controls.
    		if ( is_null( $control ) ) {
    			return $converter;
    		} elseif ( ! isset( $converter[ $control ] ) || empty( $converter[ $control ] ) ) {
    			return false;
    		} else {
    			return $converter[ $control ];
    		}
    	}
    }
    
    if ( ! function_exists( 'query_vars_wp_cities' ) ) {
    
    	/**
    	 * Function for 'query_vars' filter-hook.
    	 * 
    	 * @param string[] $public_query_vars The array of allowed query variable names.
    	 *
    	 * @return string[]
    	 */
    	function query_vars_wp_cities( $public_query_vars ){
    
    		$public_query_vars[] = 'city';
    
    		return $public_query_vars;
    	}
    }
    add_filter( 'query_vars', 'query_vars_wp_cities' );


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

    echo '<ul class="city-list">';
    
    foreach ( get_converter_wp_cities() as $key => $city ) {
    	$url = add_query_arg( array( 'city' => $key ), get_home_url( '/' ) );
    
    	echo '<li class="city-list-item"><a href="' . esc_url( $url ) . '" class="link">' . esc_html( $city ) . '</a></li>';
    }
    
    echo '</ul>';


    Получить значение текущего горда из гет-параметра мы можете функцией get_query_var()

    $city = get_query_var( 'city', false );
    var_dump( $city );


    Чтобы создать записи физически, как в вашем примере, вы можете зарегистрировать тип записи и таксономии для него с помощью register_post_type() и register_taxonomy(), а создать записи wp_insert_post()

    Шорткод можете создать по этому шаблону
    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' => get_query_var( 'city', false ),
    		), $atts );
    
    		if ( $atts['city'] ) {
    			$output = '<span class="current-city">' . esc_html( get_converter_wp_cities( $atts['city'] ) ) . '</span>';
    		}
    
    		return apply_filters( 'wp_city', $output );
    	}
    }
    add_shortcode( 'wp_city', 'wp_city' );


    Большая проблема — собирать тексты и заголовки для SEO. Для создания переменных плагина Yoast можете взять этот шаблон

    function get_yoast_current_city() {
    
    	$city = get_query_var( 'city', false );
    
    	if ( $city ) {
    		$string = $city;
    	} else {
    		$string = '';
    	}
    
    	return $string;
    }
    
    
    // Define the action for register yoast_variable replacments.
    function register_custom_yoast_variables() {
    	wpseo_register_var_replacement( '%%CurrentCity%%', 'get_yoast_current_city', 'advanced', __( 'Some instead title text', 'wpgen' ) );
    }
    
    // Add action.
    add_action( 'wpseo_register_extra_replacements', 'register_custom_yoast_variables' );


    Еще одна проблема в том, что вам понадобятся склонения городов в тексте и заголовках. Для решения этой задачи я создавал большую excel-таблицу со списком и парсил ее библиотекой SimpleXLSX

    655af38fd63a6389461115.png
    Ответ написан
    2 комментария
  • Почему не выводится изображение в шапку сайта?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Используйте функцию get_theme_file_uri()

    $image_path = get_theme_file_uri( '/assets/images/MyTheme-Header.png' );
    Ответ написан
    Комментировать
  • Как можно настроить генерацию имен полей, что бы не повторялись?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Есть функция wp_unique_post_slug(), которая не дает публиковать записи с двумя одинаковыми слагами. Можно использовать ее или по аналогии написать такую же для полей wp_postmeta
    Ответ написан
  • Как создать структуру сайта на Wordpress?

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

    • /math/?type=mcko&klass=1
    • /math/?type=mcko&klass=2
    • /math/?type=vpr&klass=1
    • /math/?type=vpr&klass=2


    • /rus-yaz/?type=mcko&klass=1
    • /rus-yaz/?type=mcko&klass=2
    • /rus-yaz/?type=vpr&klass=1
    • /rus-yaz/?type=vpr&klass=2
    Ответ написан
    Комментировать
  • Как убрать дубликат главной страницы Wordpress?

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

    • domain-name.com/#creation-of-the-order
    • domain-name.com/#all-roads-lead-to-rome
    • domain-name.com/?brand=123
    • domain-name.com/?model=123
    • domain-name.com/?form-email=123
    • domain-name.com/?custom_query_var=123
    Ответ написан
    Комментировать
  • Как изменить заголовок на конкретной странице в WordPress?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Чтобы получить значение гет-запроса вы можете использовать функцию get_query_var(). Например, вы можете использовать эту функцию в фильтре the_title

    if ( ! function_exists( 'the_title_callback' ) ) {
    
    	/**
    	 * Function for 'the_title' filter-hook.
    	 * 
    	 * @param string $post_title The post title.
    	 * @param int    $post_id    The post ID.
    	 *
    	 * @return string
    	 */
    	function the_title_callback( $post_title, $post_id ) {
    
    		$city = get_query_var( 'location_location1', false );
    
    		if ( $city && get_converter_cities( $city ) ) {
    			$post_title = $post_title . ' ' . get_converter_cities( $city );
    		}
    
    		return $post_title;
    	}
    }
    add_filter( 'the_title', 'the_title_callback', 10, 2 );
    
    if ( ! function_exists( 'get_converter_cities' ) ) {
    
    	/**
    	 * Return string or array with city values.
    	 * 
    	 * @since 1.0.0
    	 *
    	 * @param string $control Key to get one value. Optional. Default null.
    	 *
    	 * @return string|array|false
    	 */
    	function get_converter_cities( $control = null ) {
    
    		// Sanitize string (just to be safe).
    		if ( ! is_null( $control ) ) {
    			$control = sanitize_title( $control );
    		}
    
    		// Main converter array.
    		$converter = array(
    			'abakan'  => __( 'Abakan', 'domain' ),
    			'moscow'  => __( 'Moscow', 'domain' ),
    			'saratov' => __( 'Saratov', 'domain' ),
    		);
    
    		$converter = apply_filters( 'get_converter_cities', $converter );
    
    		// Return controls.
    		if ( is_null( $control ) ) {
    			return $converter;
    		} elseif ( ! isset( $converter[ $control ] ) || empty( $converter[ $control ] ) ) {
    			return false;
    		} else {
    			return $converter[ $control ];
    		}
    	}
    }
    Ответ написан
    6 комментариев