Нужен совет > преобразование назначений категорий в пользовательские мета-значения записей

16 сент. 2010 г., 21:24:41
Просмотры: 130
Голосов: 1

Прежде чем я узнал о возможности добавления метабокса (с пользовательскими мета-выборами) в редактор страниц и записей, я использовал (и до сих пор частично использую) категории для определения пользовательских мета-данных записей.

Например, чтобы сделать запись 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-запросов, выполняемых для каждого возможного назначения категории?

0
Все ответы на вопрос 1
4

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

Что-то вроде этого (обязательно проверьте на тестовой копии данных и т.д.):

$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 );
17 сент. 2010 г. 08:58:40
Комментарии

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

Scott B Scott B
17 сент. 2010 г. 16:45:13

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

jerclarke jerclarke
14 нояб. 2010 г. 01:37:32

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

jerclarke jerclarke
14 нояб. 2010 г. 19:46:33

@Jeremy Clarke да, это логично. На момент ответа я не углублялся в более сложные вещи, так как мой первоначальный ответ был принят, и я решил, что для Скотта этого достаточно.

Rarst Rarst
14 нояб. 2010 г. 20:21:12