Como alterar o caso de todos os títulos de postagem para "Título do Caso"

13

Estou ajudando meu pai com seu site WordPress.
Possui mais de 1.700 posts com TITLES IN UPPERCASE.

Gostaríamos de alterá-los para "Title Case" no banco de dados (possivelmente usando este script PHP ).

O plug-in "To Title Case" do WordPress altera o caso no nível do modelo - gostaríamos de alterá-lo no nível do banco de dados.

Qual seria a melhor maneira de aplicar o script a todos os títulos no banco de dados do WordPress?
Eu poderia escrever um código do zero, mas acho que existem métodos / códigos existentes que podem aplicar uma função / método em todos os títulos.

BaronGrivet
fonte
1
Eu escreveria um rascunho de formulário de loop. Deve ser bem simples, mas se você quiser reutilizar o código do plug-in, publique as partes relevantes.
S03
Presumo que os títulos foram adicionados manualmente em maiúsculas?
Brad Dalton
@ BradDalton - isso é correto, ele adquiriu o hábito de digitar seus títulos de artigos / blogs em MAIÚSCULAS.
BaronGrivet
Você já encontrou uma solução para isso?
Brad Dalton
@BradDalton - sim, a solução que selecionei abaixo "Atualizando as postagens"
BaronGrivet

Respostas:

19

Atualizando as postagens

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

Convertendo uma seqüência de caracteres para "Título do caso"

E, embora não seja pertinente ao WP, por uma questão de integridade:

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

Obviamente, as duas listas de palavras podem ser expandidas - a lista em minúsculas, especialmente por mais preposições, os acrônimos daqueles que são usados ​​com frequência no site atual.

Porém, a parte específica do WP é apenas o bloco de código superior.

Johannes Pille
fonte
1
Um título com WordPress, MySQL e OpenOffice : D
fuxia
: D Só vi esse 2 dia. Sim, isso é uma pegadinha ...
Johannes Pille
Como a parte "Atualizando as postagens" se encaixa no meu arquivo de modelo no lugar de <?php the_title(); >?
Pete
9

Você pode alterar o título da postagem quando ela é visualizada:

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

Esta é apenas uma ideia, com base nesta resposta . Não testado .

fuxia
fonte
Funciona bem para mim.
Pete
0

Uma "solução" rápida seria via CSS usando transformação de texto .

text-transform: capitalize;

No entanto, seria melhor se você pudesse alterar a capitalização no banco de dados, pois isso é uma questão de estilos, não de conteúdo :) Se você quiser títulos em maiúsculas, faça isso através de CSS ou você terá esse tipo de problema!

Nahuel
fonte
1
Isso pode colocar apenas letras minúsculas em maiúsculas, não palavras que já estejam em maiúsculas.
Pete
0

Isso funciona em um título individual por referência de título

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

strtolower transforma o título em minúsculas. Então o ucwords torna o caso apropriado

Jon
fonte