nanny_ogg
@nanny_ogg
My name is Masha. I'm from Russia

Произвольный url в wp?

Изменяла вид url по туториалу отсюда https://misha.blog/wordpress/taksonomii-v-url-tipo...
Сейчас у меня url имеет вид сайт.ру/имя-типа-записи/имя-первого-в-списке-термина-таксономии/имя-товара

Теперь мне нужно, чтобы url был вида сайт.ру/имя-типа-записи/имя-термина-таксономии/имена-тэгов-которые-относятся-к-товару/имя-товара
Добавляю новый код с тэгами
function true_post_type_permalink( $permalink, $post_id, $leavename ) {

  $post_type_name = 'products'; // название типа записи, вы можете найти его в админке или в функции register_post_type()
  $post_type_slug = 'products'; // часть URL товаров, не всегда совпадает с названием типа записи!
  $tax_name = 'catalog'; // ну это понятно, название таксономии - категории товаров

  $post = get_post( $post_id ); // получаем объект поста по его ID

  if ( strpos( $permalink, $post_type_slug ) === FALSE || $post->post_type != $post_type_name ) // не делаем никаких изменений, если тип записи не соответствует или если URL не содержит ярлык tovar
    return $permalink;

        $termini = wp_get_object_terms( $post->ID, $tax_name ); // получаем все категории, к которым принадлежит данный товар
        
        //новый код, получает все тэги, записывает в строку
        $tags = get_the_tags( $post_id );
        $tag_string = '';
        $count_tags = 0;
        foreach ($tags as $key => $tag) {
          $count_tags++;
          if ($tag->count == $count_tags-1) {
            $tag_string .= $tag->slug;
          } else{
            $tag_string .= $tag->slug.'/';
          }
        }


        if ( !is_wp_error( $termini ) && !empty( $termini ) && is_object( $termini[0] ) )
          $permalink = str_replace( $post_type_slug, $post_type_slug.'/'.$termini[0]->slug.'/'.$tag_string, $permalink );  //новый код, дописывает к url существующие тэги 

  return $permalink;
}


add_filter('request', 'true_post_type_request', 1, 1 );

function true_post_type_request( $query ){
  global $wpdb; // нам немного придётся поработать с БД

  $post_type_name = 'products'; // указываем тут название типа записей товара
  $tax_name = 'catalog'; // а также название таксономии - категории товаров

  $yarlik = $query['attachment']; // после того, как мы изменили ссылки товаров в предыдущей функции, WordPress начал принимать их за страницы вложений

  // а теперь давайте получим ID товара, ярлык которого соответствует запросу на странице
  $post_id = $wpdb->get_var(
    "
    SELECT ID
    FROM $wpdb->posts
    WHERE post_name = '$yarlik'
    AND post_type = '$post_type_name'
    "
  );

  $termini = wp_get_object_terms( $post_id, $tax_name ); // товар должен находиться в категории (одной или нескольких)


  if( isset( $yarlik ) && $post_id && !is_wp_error( $termini ) && !empty( $termini ) ) : // изменяем запрос, если всё ок

    unset( $query['attachment'] );
    $query[$post_type_name] = $yarlik;
    $query['post_type'] = $post_type_name;
    $query['name'] = $yarlik;

  endif;

  return $query; // возвращаем результат
}


Но с добавлением к url тэгов получается 404 страница, так же получается, если дописывать туда не один термин, а все. Как это можно решить?
  • Вопрос задан
  • 499 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы