Jak zmienić wielkość liter wszystkich tytułów postów na „Tytuł tytułów”

13

Pomagam ojcu w jego witrynie WordPress.
Ma ponad 1700 postów z TYTUŁAMI WIELKIMI LITERAMI.

Chcielibyśmy zmienić je na „Tytuł sprawy” w bazie danych (prawdopodobnie przy użyciu tego skryptu PHP ).

Wtyczka WordPress „To Title Case” zmienia wielkość liter na poziomie szablonu - chcielibyśmy to zmienić na poziomie bazy danych.

Jaki byłby najlepszy sposób zastosowania skryptu do wszystkich tytułów w bazie danych WordPress?
Mógłbym napisać kod od zera, ale domyślam się, że istnieje kod / metody, które mogą zastosować funkcję / metodę we wszystkich tytułach.

BaronGrivet
źródło
1
Chciałbym napisać zarys formy Loop. Powinno to być dość proste, ale jeśli chcesz ponownie użyć kodu wtyczki, opublikuj odpowiednie części.
s_ha_dum
Zakładam, że tytuły zostały dodane ręcznie dużymi literami?
Brad Dalton,
@BradDalton - to prawda, przyzwyczaił się pisać swoje tytuły artykułów / blogów w wielkich literach.
BaronGrivet,
Znalazłeś już na to rozwiązanie?
Brad Dalton,
@BradDalton - tak, rozwiązanie, które wybrałem poniżej „Aktualizowanie postów”
BaronGrivet

Odpowiedzi:

19

Aktualizacja postów

$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
    ));
}

Konwertowanie ciągu znaków na „Case Case”

I chociaż nie dotyczy WP, ze względu na kompletność:

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;
}

Oczywiście obie listy słów można rozszerzyć - lista małych liter, zwłaszcza o więcej przyimków, akronimy od tych, które są często używane w bieżącej witrynie.

W każdym razie część specyficzna dla WP jest tylko górnym blokiem kodu.

Johannes Pille
źródło
1
Tytuł z WordPress, MySQL i OpenOffice : D
fuxia
: D Widziałem to tylko 2 dni. Tak, to gotcha ...
Johannes Pille,
W jaki sposób część „Aktualizacja wpisów” pasuje do mojego pliku szablonu zamiast <?php the_title(); >?
Pete
9

Możesz zmienić tytuł wpisu, gdy jest wyświetlany:

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;
}

To tylko pomysł oparty na tej odpowiedzi . Nie testowane .

fuxia
źródło
Działa dla mnie dobrze.
Pete
0

Szybkie „rozwiązanie” byłoby za pomocą CSS przy użyciu transformacji tekstu .

text-transform: capitalize;

Najlepiej byłoby jednak zmienić wielkość liter w bazie danych, ponieważ jest to kwestia stylów, a nie zawartości :) Jeśli chcesz, aby tytuły pisane były dużymi literami, zrób to za pomocą CSS, inaczej będziesz miał tego rodzaju problem!

Nahuel
źródło
1
Może to zawierać tylko wielkie litery, a nie słowa, które są już wielkie.
Pete
0

Działa to w odniesieniu do poszczególnych tytułów na podstawie odniesienia

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

strtolower zamienia tytuł na małe litery. Zatem ucwords sprawia, że ​​jest to właściwe

Jon
źródło