Нужен совет > преобразование назначений категорий в пользовательские мета-значения записей
Прежде чем я узнал о возможности добавления метабокса (с пользовательскими мета-выборами) в редактор страниц и записей, я использовал (и до сих пор частично использую) категории для определения пользовательских мета-данных записей.
Например, чтобы сделать запись nofollow или noindex, я создал категорию с названием nofollow и другую под названием noindex, и назначал одну или обе эти категории для записи или страницы.
Затем в моем файле header.php я использовал проверку in_category, чтобы добавить соответствующие мета-теги на страницу.
Пример:
<?php
if (in_category('noindex') && in_category('nofollow')){?>
<meta name="robots" content="noindex, nofollow">
<?php}?>
У меня также есть пользовательские категории для таких вещей, как "Отключить Adsense для этой страницы", "Не показывать вложения изображений для этой страницы", "Скрыть эту страницу из меню" и т.д...
Теперь, когда я решил перейти от использования категорий к пользовательским мета-полям, приведенный выше код в header.php преобразуется в...
<?php
if (get_post_meta( $post->ID, '_noindex', true ) && get_post_meta( $post->ID, '_nofollow', true )){>?
<meta name="robots" content="noindex, nofollow">
<?php } ?>
Это мой план, но теперь у меня есть проблема обновления сайтов, которые используют старый способ определения пользовательских настроек записей через назначение категорий.
Мне нужен алгоритм, который будет переназначать значения категорий в пользовательские мета-значения для каждой записи и страницы на обновляемом сайте.
Я ищу быстрый совет по реализации этого и, возможно, подсказки по необходимому коду.
Поскольку это тема, которая может обновляться, я хотел бы запускать скрипт один раз при первой установке темы (или когда пользователь нажимает мою утилиту обновления), который пройдет по таблице записей и для каждого случая использования моих пользовательских категорий создаст соответствующие пользовательские мета-назначения для записи или страницы.
Например, если запись в настоящее время принадлежит категории "Hidden", ей будет назначено мета-поле "_hidden".
Надеюсь, я объяснил это достаточно понятно. Буду благодарен за любые идеи.
Возможно, это так же просто, как серия пользовательских SQL-запросов, выполняемых для каждого возможного назначения категории?

Основная идея заключается в переборе записей и их категорий, с присвоением метаданных при совпадении.
Что-то вроде этого (обязательно проверьте на тестовой копии данных и т.д.):
$posts = get_posts( array(
'numberposts' => -1
) );
foreach( $posts as $post ) {
$categories = get_the_category( $post->ID );
foreach( $categories as $category ) {
if( 'Hidden' == $category->name )
add_post_meta( $post->ID, '_hidden', 'yes', true );
}
}
Забыл добавить удаление после завершения:
$category = get_category_by_slug( 'hidden' );
wp_delete_category( $category->term_id );

Выглядит хорошо, Rarst. Я попробую и отпишусь о результатах. Большое спасибо за быстрый и подробный ответ.

Это может быть не самой лучшей идеей, если у вас очень большая база данных. Большинство сайтов, вероятно, смогут загрузить все записи одновременно, но если у вас есть тысячи записей, это может превысить лимит времени выполнения PHP или что-то подобное. Ядро WordPress выполняет подобные операции частями с использованием AJAX. Должен быть плагин, который это делает, но я его не нашёл.

Если вы аккуратно удалили категорию из записи, а не удалили её полностью, вы можете использовать небольшое число, например 500 записей, и просто продолжать перезагружать страницу/нажимать кнопку, пока не останется записей в запросе категории.
