Intereting Posts
Создание перевода строк с помощью html в нем Функция повторной факторизации пользовательской выписки как я могу добавить массив типов сообщений в этот запрос? показывать сообщения из определенной категории на странице, в тематической детской теме? Неопределенный индекс: rating_score … / wp-postratings.php в строке 994 добавить значение к запросу внешней ссылки в форме поиска Безопасно ли передавать права администратора? Загрузите файл .php в div с помощью ajax Иметь домашнюю страницу выглядят иначе, чем index.php без статической страницы Индивидуальная архивная разбивка по страницам 404 Создайте сообщение, используя код в настраиваемом типе сообщений Как добавить несколько кнопок в TinyMCE? Галерея WordPress не сортирует изображения, если я изменяю порядок идентификаторов изображений Отправка электронной почты для пользовательской формы в wordpress Пользовательская разбивка на страницы

get_post_permalink () и пользовательская перестановка ссылок

Я работал над CPT с именем «продукт», который имеет пользовательские постоянные ссылки. Вот часть этого CPT:

'rewrite' => array( 'slug' => 'catalog/%product-cat%', 'with_front' => false ), 

Затем я добавляю фильтр, чтобы правильно переписать ссылки так, как я хочу:

 add_filter('post_type_link', 'product_type_permalink', 10, 4); 

где product_type_permalink ведет себя следующим образом: он заменяет %product-cat% на пользовательское поле сообщения, определенное в CPT «product», а затем возвращает ссылку. Вот его код:

 function product_type_permalink($post_link, $id=0) { // current post global $post; // if it is not a product if(!is_object($post) || $post->post_type!= 'product') { return $post_link; } else { // retrieves the product category (which is a custom taxonomy) if($terms = wp_get_object_terms($post->ID, 'category-product')) // must be done in order to avoid warnings when creating a new product if (!empty($terms[0])) { //retrieves the slog of "category-product" $term = $terms[0]->slug; // rewrites the permalink $permalink = str_replace('%categorie-produit%', $term, $post_link); return $permalink; } } } 

Следовательно, постоянные ссылки, наконец, выглядят следующим образом: www.mysite.com/catalog/lectures/a-custom-post или www.mysite.com/catalog/anythingelse/another-custom-post .

Все описанные выше операции работают правильно: они определены в файле functions.php дочерней темы.

Теперь я создал специальную страницу архива для другого CPT с именем «session», и на этой странице архива мне нужно получить URL-адрес некоторых продуктов. Каждый «сеанс» имеет настраиваемое поле «продукт».

Таким образом, файл session-archive.php имеет запрос WP, который извлекает все сеансы, и где-то в этом файле я писал:

 //session_product is the custom field in the session CPT that references a product if (!empty(get_post_meta( $id, 'session_product', true ))) { //gets the product id $id_product = get_post_meta( $id, 'session_product', true ); //gets the product title $title_product = get_the_title($id_product); //gets the permalink $permalink_product = get_post_permalink($post = $id_product, $leavename = false); } 

Я могу получить все, кроме постоянной ссылки, несмотря на то, что $leavename = false (то есть, anaway, установленное значение false по умолчанию) остается под формой «%%»:

 catalog/%product-cat%/a-custom-post 

Очевидно, это происходит из-за того, что пользовательский файл архива отличается от файла functions.php, где я определил переписывание постоянных ссылок.

Но что я могу сделать, чтобы решить эту проблему? Есть ли способ учесть фильтр post_type_link файла functions.php, чтобы вернуть правильные постоянные ссылки?

благодаря

EDIT Я использовал трюк, чтобы решить эту проблему, но мой ответ по-прежнему остается: почему фильтр post_type_link, расположенный в функции.php, не вызывается / не принимается во внимание при посещении страницы пользовательского архива?

В любом случае вот трюк: на странице архива я переписал постоянную ссылку на продукты

 $permalink_product = str_replace('%category-product%', 'product', $permalink_product); 

Проблема должна заключаться в том, как вы определяете свою переменную post. Вы считаете, что это глобальная $post но это не всегда так, особенно в несингулярных страницах, таких как архивы.

Сам фильтр предоставляет правильный экземпляр почты, который был вызван как второй параметр.

 function product_type_permalink( $post_link, $post ) { // current post is already defined. ... } 

Также не смущайтесь тем фактом, что ваш код находится в functions.php . Он загружается на каждую нагрузку на страницу WP, вкл. в админ.