@Shimpanze

Почему не работают ссылки для произвольного типа записей?

Прошу помочь с функциями. Работает только последнее правило. Дело именно во второй функции. Как её правильно написать, чтобы срабатывали оба правила, а не только последнее?

add_filter( 'post_type_link', function( $link, $post = 0 ) {

  global $post;

  if ( $post->post_type == 'projects' ) {
    return home_url( '/' . $post->ID );
  } else if ( $post->post_type == 'colors' ) {
    return home_url( '/' . $post->ID );
  } else {
    return $link;
  }

}, 1, 3 );




add_action( 'init', function() {

  add_rewrite_rule( '([0-9]+)?$', 'index.php?post_type=projects&p=$matches[1]', 'top' );
  add_rewrite_rule( '([0-9]+)?$', 'index.php?post_type=colors&p=$matches[1]', 'top' );

});
  • Вопрос задан
  • 147 просмотров
Решения вопроса 1
rOOse
@rOOse
Frontend developer
Давайте сперва разберемся почему так происходит :-)

К примеру у вас есть запись в projects c id == 123, а также запись в colors c id == 124
Вы добавляете правило с рег. выражением ([0-9]+)?$ и хотите чтобы по такой ссылке WP вам выдал запись с projects, а потом добавляете еще одно правило с таким же рег. выражением, но уже хотите выдачу записи с colors, вопрос: откуда WP узнает что это разные типы записей? Ответ: никак, так как рег. выражение одинаковое, то WP перезапишет предыдущее правило последним.

Отсюда вывод, вам нужно изменить ссылки на записи так чтобы рег. выражения в правилах отличались, к примеру p123 и c124 или project-123 и color-124 или что-то типа того.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
HeadOnFire
@HeadOnFire
PHP, Laravel & WordPress Evangelist
У вас одна и та же регулярка, она срабатывать будет один раз (последняя запись, ибо благодаря аргументу top она добавляется в верх списка rewrite_rules) и возвращать true, после чего все дальнейшие проверки прекращаются. Обычно такие задачи решаются префиксами в url:
/projects/XXX
/colors/XXX
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы