Массовое редактирование записей

👍 Научим бесплатно правильно создавать сайты на WordPress. Подробнее →

Есть каталог машин. В нём все машины имеют свои уникальные номера, не по порядку. Раньше Я записывал их в начало заголовка (например, «92. Toyota Ist 2002 год»), но теперь пришла необходимость убрать номер из заголовка и вставить его в дополнительное поле.
Можно сделать это без ручного редактирования каждой записи? А то Я этот каталог уже дважды перебирал, а там около 80 записей!

Создай свой первый сайт на WordPress

Grawl
Оцените автора
Добавить комментарий

  1. tiaurus

    А все номера разные?

    Ответить
    1. Grawl

      Да.

      Ответить
      1. tiaurus

        Если да, то тут никак, кроме прямого редактирования, не решить проблему. Однако можно упростить редактирование, если воспользоваться плагинами наподобие Search and Replace. Он позволяет напрямую в базе данных искать и заменять текст, не редактируя каждый пост.

        Ответить
  2. Sergey Biryukov

    Написал пример скрипта: http://wordpress.pastebin.com/NfcQncyM
    Перед запуском стоит сделать резервную копию базы. Скрипт должен быть в корневом каталоге (рядом с wp-load.php).

    Ответить
    1. Grawl

      Получилось! ^____^
      Благодарю!!!

      Ответить
      1. tiaurus

        А что делает этот скрипт? В чем его суть?

        Ответить
        1. Grawl

          Удаляет из заголовка записей номер вместе с точкой и пробелом и вставляет его записям дополнительным полем с именем «name».

          Ответить
          1. tiaurus

            То есть скрипт ищет в заголовке цифры, удаляет их оттуда и переносит в произвольное поле. А это поле точно называется name? Или number?

            Ответить
    2. tiaurus

      Как долго хранится код на pastebin.com?

      Ответить
      1. Grawl

        Я немного поискал, и не нашёл ответа. Задал вопрос на Google Ответах, сразу-же ответили “7 дней”. Но Я не уверен, что прям семь. Хотя, на последней странице архива Pastebin самые давние сохранены 1 день назад.

        Ответить
      2. Grawl

        Видимо, вечно. При публикации нового кода есть параметр «Post expiration», и по-умолчанию он выставлен на «Never».

        Ответить
    3. Grawl

      Насчёт бэкапа данных — это ценная подсказка :)
      Благодарю! Сейчас попробую.

      Ответить
    4. Grawl

      А теперь хорошо было бы то же самое и с годом сделать. Можно? Ну пожа-а-алуйста :3

      Ответить
      1. Sergey Biryukov

        Для года:

        <?php
        include 'wp-load.php';
        $posts = get_posts('numberposts=-1');
        foreach ( $posts as $post ) {
        	preg_match('/(.*) ([0-9]{4})/', $post->post_title, $matches);
        	if ( !empty($matches) ) {
        		echo "Post #{$post->ID}<br />n";
        
        		echo "Title: {$matches[1]}<br />n";
        		$post->post_title = $matches[1];
        		wp_update_post($post);
        
        		echo "Year: {$matches[2]}<br />n";
        		add_post_meta($post->ID, 'year', $matches[2], true);
        	}
        }
        echo 'All Done!';
        ?>
        

        Стоит сделать бэкап и в этот раз :)

        Ответить
        1. Sergey Biryukov

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

          Полный фрагмент: http://wordpress.pastebin.com/YiN1r0BP

          Вероятно, нужно было вставлять без <?php и ?>. Но даже в этом случае некоторые детали пропадают (например, во фрагменте, который Grawl вставил ниже, отсутствуют теги <br />).

          Ответить
          1. tiaurus

            На счет тегов <br/> — приведите пример кода. У меня вроде нормально отображается все.
            По поводу остального кода — есть баг с отображением вот этого куска кода: <?php — добавляется лишний пробел между < и ?php. Чтобы этого не происходило, < можно вставлять так:
            [img]http://dl.dropbox.com/u/2027201/Images/tiaurus-2011-01-23_093222.png[/img]

            Ответить
          2. Sergey Biryukov

            Понятно, спасибо. Пример можно посмотреть по исходной ссылке на Pastebin. Наверное, <br /> тоже нужно было вставлять через &lt; и &gt;. Это терпимо, хотя и не очень удобно.

            Ответить
          3. Grawl

            И это сработало! :) С первого же раза! :) Даже не знаю, чем отблагодарить :)

            Ответить
            1. tiaurus

              Лучшая благодарность удаленному помощнику — денежная :)

              Ответить
          4. Grawl

            Да. Надо будет зарплаты кусочек выпилить доброму человеку :)

            Ответить
  3. Grawl

    Вообще, наверное, надо ссылку: http://abc-japan.ru/catalog

    Ответить
  4. Grawl

    Вижу, что tiaurus волнуется за сохранность пригодившегося скрипта. Думаю, неплохо будет увековечить его здесь:

    include 'wp-load.php';
    $posts = get_posts('numberposts=-1');
    foreach ( $posts as $post ) {
            preg_match('/([0-9]*). (.*)/', $post->post_title, $matches);
            if ( !empty($matches) ) {
                    echo "Post #{$post->ID}n";
     
                    echo "Number: {$matches[1]}n";
                    add_post_meta($post->ID, 'number', $matches[1], true);
     
                    echo "Title: {$matches[2]}n";
                    $post->post_title = $matches[2];
                    wp_update_post($post);
            }
    }
    echo 'All Done!';
    
    Ответить
    1. tiaurus

      Есть вопрос и есть работающий ответ. Думаю, что и то и другое может быть полезно не только задавшему и ответившему, но и другим. А зная, что публичные онлайновые сервисы не хранят данные вечно, лучше все же приводить код прямо тут.

      Ответить
      1. Sergey Biryukov

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

        Pastebin рекомендуется в правилах англоязычного форума WordPress, где сохранность не менее важна, и содержит фрагменты как минимум трёхлетней давности.

        Если предпочтительно всё же копировать сюда — нет проблем.

        Ответить
  5. Sergey Biryukov

    Не по теме — придумал решение проблемы с тегами внутри кода (для <?php, <br /> и любых других) при использовании SyntaxHighlighterPro. Можно добавить фрагмент в functions.php темы:

    function esc_html_for_php($comment_text) {
    	preg_match('/<pre>(.*?)

    /is', $comment_text, $matches);
    if ( !empty($matches) )
    $comment_text = str_replace($matches[1], esc_html($matches[1]), $comment_text);
    return $comment_text;
    }
    add_filter('comment_text', 'esc_html_for_php', 0);

    Ответить
    1. tiaurus

      Добавил — не работает :(

      Ответить
    2. tiaurus

      Решил проблему сменой плагина, использующего скрипт SyntaxHighlighter на плагин, использующий библиотеку GeSHi.

      Ответить
      1. Sergey Biryukov

        Спасибо! Проверил CodeColorer на тестовом блоге — все символы сохраняются.

        Ответить