Intereting Posts
CSS не применяется Помогите перехватить save_post через плагин В какой последовательности перехватываются крючки, когда публикация «публикуется»? save_post для включения фильтра wp_insert_post_data, сбора информации о метаполе и предотвращения бесконечного цикла Проверьте, находится ли продукт в определенной категории в Functions.php set_query_var, похоже, не работает с init hook Санитарная обработка данных для регистрации пользователя и входа пользователя WordPress.com против WordPress.org Механизм аутентификации / входа (не wp-admin) почему создание таблиц с использованием $ wpdb не выполняется при установке плагинов? Добавление обменных ячеек на страницы вложений Вызов каталогов для загрузки в wordpress Показывать сообщения с другого сайта с использованием REST API асинхронно Я хочу показать только данные на сегодня Как найти код, выполняемый при вызове wp_head ()?

Изменить постоянную ссылку для custom_post_type с помощью custom_post_meta (woocommerce)

Я хотел бы заменить permalink для всех продуктов в woocommerce / wp-установке с помощью специальной ссылки, если она установлена ​​в custom_post_meta .

custom_post_meta настроен и работает нормально. Из всего, что я прочитал, функция ниже должна сделать трюк:

 function eli_changeProductLink($permalink, $post) { if ('product' == $post->post_type) { $custom_url = get_post_meta($post->id, '_eli_product_link', true); $permalink = $custom_url ?: $permalink; } return $permalink; } add_filter('post_type_link', 'eli_changeProductLink', 11, 2); 

Я даю ему приоритет 11, потому что я хочу, чтобы он запускался после wc_product_post_type_link() , который имеет приоритет 10.

Может ли кто-нибудь определить, что мне здесь не хватает? Или придумайте возможные причины, почему это может не работать так, как ожидалось? Использование WC 2.4.10 с WP 4.3.1 (оба последних на момент публикации).

Спасибо.

$post в обработчике обратного вызова – это объект, а свойства объекта, такие как переменные, чувствительны к регистру . Поэтому вам нужно использовать $post->ID , а не $post->id .

Вопрос здесь: как мы можем предотвратить ошибки, подобные этой во время разработки?

Для объектов есть простое решение: использовать тип намека и IDE, который его использует.

Если вы измените подпись своего обработчика обратного вызова на это …

 function eli_changeProductLink($permalink, \WP_Post $post) 

… IDE, например PHPStorm или Eclipse, предложит правильные имена свойств во время ввода:

Снимок экрана IDE

Второй урок, который мы можем извлечь из этого: используйте последовательную схему именования для собственных переменных и свойств, в отличие от WordPress, которая смешивает в верхнем и нижнем регистре символы подчеркивания и дефисов. Придерживание только одной схемы облегчит жизнь другим людям, когда им придется работать с вашим кодом.

Дурак я. Не использовали WP через некоторое время, и полностью забытый идентификатор должен быть капитализирован.

Изменен post->id для post->ID и он работает по назначению.

Извините за то, что потратил ваше время.