WordPress как на ладони
wordpress jino

add_permastruct() WP 3.0.0

Добавляет новую структуру ЧПУ для постоянных ссылок.

Создает не одно правило, а несколько на основе одной указанной пермаструктуры, какие правила создать определяется в параметре $args и тегах самой структуры...

Объяснение

Структура постоянных ссылок - это абстрактное понятие и означает установку (определение) правил того, как должна выглядеть ЧПУ (человеко-понятная УРЛ).

add_permastruct() дает возможность быстро создать группу правил с регулярными выражениями которые разберут и перезапишут URL во внутренние параметры запроса. Новые правила будут добавленные массив WP_Rewrite::$extra_permastructs.

Когда правила перезаписи создаются функцией WP_Rewrite::rewrite_rules(), все эти новые пермаструктуры передаются в функцию WP_Rewrite::generate_rewrite_rules(), которая в свою очередь изменяет их в регулярные выражения.

Параметр $args дает возможность контролировать как WP_Rewrite::generate_rewrite_rules() будет преобразовывать новую пермаструктуру.

Объяснение еще раз, другими словами.

Добавленная структура, например, kniga/%book% разбирается и на основе нее добавляются нужные правила перезаписи ЧПУ в настройки ЧПУ (смотрите глобальную переменную $wp_query).

Теги указанные в структуре, например %book%, заменяются на соответствующую часть регулярного выражения, которая указывается при регистрации тега перезаписи в add_rewrite_tag().

Если в структуре указаны неизвестные теги, то они будут указаны в правилах перезаписи как есть, например если указан тег %order_id%:

[order/%order_id%/?$] => index.php?%order_id%$matches[1]

На что нужно заменить указанный тег определяется функцией add_rewrite_tag().

Обычно используется в связке с функциями: add_rewrite_tag() и add_rewrite_rule()

Работает на основе метода WP_Rewrite::add_permastruct( $name, $struct, $args )

Работает на основе: WP_Rewrite()

Хуков нет.

Возвращает

null. Ничего.

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

add_permastruct( $name, $struct, $args );
$name(строка) (обязательный)
Название структуры. Название типа записи, для которого создается структура ЧПУ.
$struct(строка) (обязательный)
Сама структура ЧПУ.
$args(массив)

Параметры построения ссылки из указанной структуры. Подробнее смотрите: WP_Rewrite::add_permastruct(). Возможные элементы массива:

  • with_front (логический)
    Нужно ли предварять структуру параметром WP_Rewrite::$front.
    По умолчанию true.

  • ep_mask (число)
    Конечная точка в структуре. Может быть: EP_NONE, EP_PERMALINK, EP_ATTACHMENT, EP_DATE, EP_YEAR, EP_MONTH, EP_DAY, EP_ROOT, EP_COMMENTS, EP_SEARCH, EP_CATEGORIES, EP_TAGS, EP_AUTHORS, EP_PAGES, EP_ALL_ARCHIVES, и EP_ALL.
    По умолчанию EP_NONE.

  • paged (логический)
    Нужно ли добавлять регулярки для страниц пагинации?
    По умолчанию true.

  • feed (логический)
    Нужно ли добавлять регулярки для страниц фидов?
    По умолчанию true.

  • forcomments (логический)
    Сделать ссылку фидов как запрос на фид комментариев
    По умолчанию false.

  • walk_dirs (логический)
    Если указать true, то правило перезаписи будет создано для каждой директории указанной в структуре. Например, если структура указана как /%year%/%month%/%day/, то правила будут созданы для директорий: /%year%/, /%year%/%month%/ и /%year%/%month%/%day%/.
    По умолчанию true.

  • endpoints (логический)
    Нужно ли добавлять конечные точки в конец правил перезаписи ЧПУ?
    По умолчанию true.

По умолчанию указываются следующие параметры:

$defaults = array(
	'with_front' => true,
	'ep_mask' => EP_NONE,
	'paged' => true,
	'feed' => true,
	'forcomments' => false,
	'walk_dirs' => true,
	'endpoints' => true,
);

По умолчанию: array() (предустановки)

Примеры

#1 Структура ЧПУ для произвольного типа записи book

Допустим при регистрации типа записи с помощью register_post_type() в параметре rewrite мы указали false. И теперь мы хотим вручную установить ЧПУ для этого типа записи, тогда добавим такой код.

add_action('init', function(){
	$post_type = 'book';

	// добавим тег перезаписи, чтобы add_permastruct() его поняла
	// он потом будет заменен на часть регулярки указанной во втором параметре
	add_rewrite_tag( "%book%", '([^/]+)', "post_type=$post_type&name=" );

	$permastruct = "kniga/%book%"; // наша структура ЧПУ

	$args = array(
		'with_front'  => true,
		'paged'       => true,
		'ep_mask'     => EP_NONE,
		'feed'        => false,
		'forcomments' => false,
		'walk_dirs'   => false,
		'endpoints'   => false,
	);

	add_permastruct( $post_type, $permastruct, $args );
});

// третий параметр в add_permastruct() можно не указывать, тогда аргументы будут по умолчанию

После установки кода, нужно сбросить правила ЧПУ, для этого нужно просто сохраниться в настройках постоянных ссылок в админке.

Код add permastruct: wp-includes/rewrite.php VER 4.9.1

<?php
function add_permastruct( $name, $struct, $args = array() ) {
	global $wp_rewrite;

	// Back-compat for the old parameters: $with_front and $ep_mask.
	if ( ! is_array( $args ) )
		$args = array( 'with_front' => $args );
	if ( func_num_args() == 4 )
		$args['ep_mask'] = func_get_arg( 3 );

	$wp_rewrite->add_permastruct( $name, $struct, $args );
}

Cвязанные функции

Из метки: Rewrite (ЧПУ перезапись)

add_permastruct 4 комментария
  • Денис

    Здравствуйте! У меня для структуры

    $permastruct = '/persons/%post_id%'

    генерируется на постах типа 'persons' пермалинк www.example.com/persons/%post_id%. Никак не могу разобраться что не так...sorry

    Ответить1.4 года назад #
    • Алексей

      Поддерживаю вопрос.
      Тоже интересно как делать, хочется сделать структуру с ID.

      Ответить1.4 года назад #
  • Игорь @

    Здравствуйте! Второй день не могу разобраться
    Есть функция для добавления в ссылку категории woocommerce окончания ".htm":

    function wpse_178112_category_permastruct_html( $taxonomy, $object_type, $args ) {
       if ( $taxonomy === 'product_cat' )
       add_permastruct( $taxonomy, "{$args['rewrite']['slug']}/%$taxonomy%.html", $args );
    }
    
    add_action( 'registered_taxonomy', 'wpse_178112_category_permastruct_html', 20, 3 );

    Сама по себе она работает как надо. Но мне нужно еще было удалить из адресной строки ярлык "product-category" - для этого нашел другой код:

    add_filter('request', 'true_smenit_request', 1, 1 );
    function true_smenit_request( $query ){
    	$taxonomia_name = 'product_cat'; 
    
    	if( $query['attachment'] ) :
    		$dochernia = true; 
    		$urlyarlyk = $query['attachment']; 
    	else:
    		$dochernia = false;
    		$urlyarlyk = $query['name'];
    	endif;
    
    	$termin = get_term_by('slug', $urlyarlyk, $taxonomia_name);
    
    	if ( isset( $urlyarlyk ) && $termin && !is_wp_error( $termin )):
    
    		if( $dochernia ) {
    			unset( $query['attachment'] );
    			$parent = $termin->parent;
    			while( $parent ) {
    				$parent_term = get_term( $parent, $taxonomia_name);
    				$urlyarlyk = $parent_term->slug . '/' . $urlyarlyk; 
    				$parent = $parent_term->parent;
    			}
    		} else {
    			unset($query['name']);
    		}
    
    		switch( $taxonomia_name ):
    			case 'category':{
    				$query['category_name'] = $urlyarlyk;
    				break;
    			}
    			case 'post_tag':{
    				$query['tag'] = $urlyarlyk;
    				break;
    			}
    			default:{
    				$query[$taxonomia_name] = $urlyarlyk;
    				break;
    			}
    
    		endswitch;
    
    	endif;
    
    	return $query;
    
    }
    
    // смена самой ссылки
    add_filter( 'term_link', 'true_smena_permalink', 10, 3 );
    
    function true_smena_permalink( $url, $term, $taxonomy, $args ){
    
    	$taxonomia_name = 'product_cat'; 
    	$taxonomia_slug = 'product-category';
    	if ( strpos($url, $taxonomia_slug) === FALSE || $taxonomy != $taxonomia_name ) return $url;
    
    	$url = str_replace('/' . $taxonomia_slug, '', $url); // если мы ещё тут, выполняем замену в URL
    
    	return $url;
    	}

    Этот код тоже отдельно исправно работает.. Но вместе они работать не хотят - ссылка формируется, так как я и хочу, но открывается по ней страница 404. (а рабочая категория открывается по ссылке без окончания .html).

    Предполагаю, что что-то нужно изменить в add_permastruct( $taxonomy, "{$args['rewrite']['slug']}/%$taxonomy%.html", $args );, но не знаю как (если я удаляю "{$args['rewrite']['slug']}" - то категории начинают открываться как надо, но все остальные страницы - ошибка 404).

    Помогите пожалуйста.

    Ответить2 месяца назад #

Здравствуйте, !

Ваш комментарий