Come cambiare il caso di tutti i titoli dei post in "Caso del titolo"


13

Sto aiutando mio padre con il suo sito Web WordPress.
Ha oltre 1.700 post con TITOLI IN MAIUSCOLO.

Vorremmo cambiarli in "Title Case" nel database (possibilmente usando questo script PHP ).

Il plug-in "To Title Case" di WordPress cambia il caso a livello di modello: vorremmo modificarlo a livello di database.

Quale sarebbe il modo migliore per applicare lo script a tutti i titoli nel database di WordPress?
Potrei scrivere un po 'di codice da zero, ma immagino ci siano codici / metodi esistenti là fuori che possono applicare una funzione / metodo su tutti i titoli.


1
Scriverei un scratch in forma di loop. Dovrebbe essere piuttosto semplice, ma se vuoi riutilizzare il codice del plugin, pubblica le parti pertinenti.
s_ha_dum,

Presumo che i titoli siano stati aggiunti manualmente in maiuscolo?
Brad Dalton,

@BradDalton - esatto, ha preso l'abitudine di scrivere i suoi titoli di articoli / blog in MAIUSCOLO.
BaronGrivet,

Hai già trovato una soluzione per questo?
Brad Dalton,

@BradDalton - sì, la soluzione che ho selezionato sotto "Aggiornamento dei post"
BaronGrivet

Risposte:


19

Aggiornamento dei post

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

Conversione di una stringa in "Caso del titolo"

E, sebbene non pertinente a WP, per completezza:

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

Ovviamente, entrambi gli elenchi di parole potrebbero essere ampliati: l'elenco in minuscolo, soprattutto con più preposizioni, gli acronimi di quelli che vengono spesso utilizzati nel sito corrente.

Comunque, la parte specifica del WP è solo il blocco di codice superiore.


1
Un titolo con WordPress, MySQL e OpenOffice : D
fuxia

: D Ho visto solo questo 2 giorni. Sì, quello è un gotcha ...
Johannes Pille,

In che modo la parte "Aggiornamento dei post" si adatta al mio file modello al posto di <?php the_title(); >?
Pete,

9

È possibile modificare il titolo del post quando viene visualizzato:

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

Questa è solo un'idea, basata su questa risposta . Non testato .


Funziona bene per me.
Pete,

0

Una rapida "soluzione" sarebbe tramite CSS usando text-transform .

text-transform: capitalize;

Tuttavia, sarebbe meglio se potessi modificare le maiuscole nel database poiché si tratta di stili, non di contenuti :) Se vuoi titoli in maiuscolo, fallo tramite CSS o avrai questo tipo di problema!


1
Questo può solo mettere in maiuscolo parole minuscole, non parole già in maiuscolo.
Pete,

0

Funziona su un singolo titolo in base al titolo di riferimento

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

strtolower trasforma il titolo in minuscolo. Quindi le parole d'ordine lo rendono il caso corretto

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.