Як змінити регістр усіх назв публікацій на "Заголовок справи"


13

Я допомагаю батькові на його веб-сайті WordPress.
Він має понад 1700 дописів із НАЗВАМИ В УПРАВЛІННІ.

Ми хотіли б змінити їх на "Case Case" в базі даних (можливо, використовуючи цей скрипт PHP ).

Плагін WordPress "Для заголовка справи" змінює регістр на рівні шаблону - ми хотіли б змінити його на рівні бази даних.

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


1
Я б написав скретч форми Loop. Це повинно бути досить простим, але якщо ви хочете повторно використовувати код плагіна, опублікуйте відповідні частини.
s_ha_dum

Я припускаю, що заголовки додаються в верхній регістр вручну?
Бред Далтон

@BradDalton - це правильно, він увійшов у звичку вводити заголовки своєї статті / блогу в ПОВНІШНІЙ.
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 робить це правильним

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.