Как изменить регистр всех заголовков сообщений на «Заголовок»

13

Я помогаю отцу с его сайтом WordPress.
Он имеет более 1700 постов с заголовками в верхнем регистре.

Мы хотели бы изменить их на «Заголовок» в базе данных (возможно, используя этого сценария PHP ).

Плагин WordPress «To Title Case» изменяет регистр на уровне шаблона - мы бы хотели изменить его на уровне базы данных.

Как лучше всего применить скрипт ко всем заголовкам в базе данных WordPress?
Я мог бы написать некоторый код с нуля, но я предполагаю, что существует существующий код / ​​методы, которые могут применять функцию / метод ко всем заголовкам.

BaronGrivet
источник
1
Я бы написал Loop форму нуля. Это должно быть довольно просто, но если вы хотите повторно использовать код плагина, разместите соответствующие части.
s_ha_dum
Я предполагаю, что заголовки добавлены вручную в верхнем регистре?
Брэд Далтон
@BradDalton - это правильно, он привык печатать заголовки своих статей / блогов в UPPERCASE.
BaronGrivet
Вы уже нашли решение для этого?
Брэд Далтон
@BradDalton - да, решение, которое я выбрал ниже "Обновление сообщений"
BaronGrivet

Ответы:

19

Обновление постов

$all_posts = get_posts(
    'posts_per_page' => -1,
    'post_type' => 'post'
);

foreach ( $all_posts as $single ) {
    wp_update_post( array(
        'ID' => $single->ID,
        'post_title' => to_title_case( $single->post_title ) // see function below
    ));
}

Преобразование строки в «Заголовок»

И, хотя не относится к WP, ради полноты:

function to_title_case( $string ) {
     /* Words that should be entirely lower-case */
     $articles_conjunctions_prepositions = array(
          'a','an','the',
          'and','but','or','nor',
          'if','then','else','when',
          'at','by','from','for','in',
          'off','on','out','over','to','into','with'
     );
     /* Words that should be entirely upper-case (need to be lower-case in this list!) */
     $acronyms_and_such = array(
         'asap', 'unhcr', 'wpse', 'wtf'
     );
     /* split title string into array of words */
     $words = explode( ' ', mb_strtolower( $string ) );
     /* iterate over words */
     foreach ( $words as $position => $word ) {
         /* re-capitalize acronyms */
         if( in_array( $word, $acronyms_and_such ) ) {
             $words[$position] = mb_strtoupper( $word );
         /* capitalize first letter of all other words, if... */
         } elseif (
             /* ...first word of the title string... */
             0 === $position ||
             /* ...or not in above lower-case list*/
             ! in_array( $word, $articles_conjunctions_prepositions ) 
         ) {
             $words[$position] = ucwords( $word );
         }
     }         
     /* re-combine word array */
     $string = implode( ' ', $words );
     /* return title string in title case */
     return $string;
}

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

Тем не менее, специфичная для WP часть - это только верхний блок кода.

Йоханнес Пилле
источник
1
Название с WordPress, MySQL и OpenOffice : D
fuxia
: D Только видел это 2 дня. Да, это гоча ...
Йоханнес Пилле
Как часть «Обновление постов» помещается в моем файле шаблона вместо <?php the_title(); >?
Пит
9

Вы можете изменить заголовок сообщения при просмотре:

add_action( 'the_post', 'wpse_94856_title_update' );

function wpse_94856_title_update( $post )
{
    if ( empty ( $post->post_title ) )
        return;

    $new_title = mb_convert_case( $post->post_title, MB_CASE_TITLE, "UTF-8" );

    if ( $post->post_title === $new_title )
        return;

    wp_update_post(
        array (
            'ID'         => $post->ID,
            'post_title' => $new_title
        )
    );

    // $post is passed by reference, so we update this property in real time
    $post->post_title = $new_title;
}

Это просто идея, основанная на этом ответе . Не тестировался .

Фуксия
источник
Хорошо работает для меня.
Пит
0

Быстрое «решение» будет через CSS с использованием преобразования текста .

text-transform: capitalize;

Тем не менее, было бы лучше, если бы вы могли изменить заглавные буквы в базе данных, поскольку это вопрос стилей, а не содержимого :) Если вы хотите заголовки в верхнем регистре, сделайте это с помощью CSS, или у вас возникнет такая проблема!

Науэль
источник
1
Это может использовать только строчные слова, а не слова, которые уже написаны заглавными буквами.
Пит
0

Это работает на основе индивидуального названия по названию

 <?php print  ucwords(strtolower(get_the_title())); ?>

strtolower превращает заголовок в строчные. Тогда ucwords делает это правильным случаем

Джон
источник