Автоматически выбирать категорию темы на основе категории поста?

Я намеренно создал абсолютно одинаковые категории в WordPress и Discourse, но нет возможности автоматически назначать категорию поста в качестве категории темы, поэтому мне приходится вручную устанавливать её после каждой публикации.

Кажется, это очевидная функция, возможно, я что-то упускаю?

Я использую плагин WP Discourse.

Это можно сделать с помощью фильтра wpdc_publish_post_category. Примерный код (не протестированный, но может сработать сразу):

function wpdc_change_post_category( $category, $post_id ) {
  $wp_category_name = get_the_category( $post_id )[0]->name;
  $discourse_categories = WPDiscourse\Utilities\Utilities::get_discourse_categories();
  $discourse_category = array_search( $wp_category_name, array_column( $discourse_categories, 'name' ));
  return $discourse_category['id'];
}
add_filter( 'wpdc_publish_post_category', 'wpdc_change_post_category' );

Тогда независимо от выбранной категории пост всегда будет публиковаться в категорию, название которой совпадает с названием категории WordPress. Однако убедитесь, что названия совпадают точно, иначе это не сработает.

Официальная поддержка этой функции как отдельной возможности сопряжена с трудностями, поскольку она потребует от пользователей поддерживать списки категорий с точно одинаковыми названиями, предполагает, что модели категорий между двумя платформами останутся неизменными, и должна учитывать тот факт, что система таксономии WordPress по своей природе изменяема (то есть она не будет одинаковой на каждом сайте WordPress, где установлен плагин).

Спасибо!

Это можно сделать с помощью фильтра wpdc_change_post_category. Это должно выглядеть примерно так (непроверенный пример кода, но, возможно, заработает сразу):

Думаю, вы имели в виду wpdc_publish_post_category? Фильтр wpdc_change_post_category, похоже, на самом деле не существует. Это просто произвольное имя функции, которое может быть любым, верно?

В строке $wp_category_name = get_the_category( $post_id )[0]->name отсутствует закрывающая ;.

После этого я получаю ошибку too few arguments (слишком мало аргументов) для function wpdc_change_post_category( $category, $post_id ) {. Возможно, это потому, что $category не определена? Позже я проведу дополнительные тесты.

Что касается добавления этого как официальной функции, я не думаю, что это создаст большие проблемы, учитывая два варианта:

  1. Уже существует опция Force Category Update (Принудительное обновление категории). Её можно расширить до функции, которая принудительно синхронизирует категории Discourse и WordPress.

или

  1. Возможно, им вообще не нужно быть синхронизированными; если категория отсутствует в Discourse, она просто создаётся.

Да, всё верно, извините за опечатку.

Существует большая разница между чтением списка категорий через API (принудительное обновление категорий) и автоматической синхронизацией самих категорий между WordPress и Discourse.

Сработает ли подобный код для сопоставления wp_categories с discourse_tags?

Я живу в мире, где «категории — это стены» :sunglasses:

К сожалению, на данный момент нет эквивалентного фильтра wpdc_publish_post_tags.

Что именно вы пытаетесь достичь с помощью тегов?

У меня есть пользовательский тип записи policies с иерархической пользовательской таксономией policy_categories в два уровня (родитель/потомок). Всего около 45 дочерних категорий.

Я настроил WP Discourse для публикации в категорию Discourse под названием policies, но вместо создания огромного набора подкатегорий (после изучения этого форума) кажется лучше создать подкатегории в виде тегов.

Различные пользователи WordPress будут публиковать policies с разным уровнем опыта (если бы это делал только я, я бы просто добавлял теги каждый раз). Чтобы избежать лишнего шага и, вероятно, значительной части проблем с поддержкой, в идеале нужен фильтр, который заставит WP Discourse брать категории WordPress и добавлять соответствующие теги Discourse.

Я готов убедиться, что категории и теги совпадают по ID/слагам и т.д., так как я буду самостоятельно обновлять их как администратор.

Спасибо за вашу помощь.

Может, это стоит обсудить в Marketplace?

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

add_filter(  'wpdc_publish_body', function( $body, $remote_post_type, $post_id ) {
   // код для получения категории политики публикации
   if ( // если существует политика публикации ) {
      $policy_tags = // сопоставьте категорию политики публикации с соответствующим тегом(ами)
      $body['tags'] = $policy_tags
   }
   return $body;
}, 10, 3);