Cómo cambiar el caso de todos los títulos de publicaciones a "Caso de título"

13

Estoy ayudando a mi padre con su sitio web de WordPress.
Tiene más de 1,700 publicaciones con TÍTULOS EN MAYÚSCULAS.

Nos gustaría cambiarlos a "Caso de título" en la base de datos (posiblemente usando este script PHP ).

El complemento "To Title Case" de WordPress cambia el caso a nivel de plantilla; nos gustaría cambiarlo a nivel de base de datos.

¿Cuál sería la mejor manera de aplicar el script a todos los títulos en la base de datos de WordPress?
Podría escribir un código desde cero, pero supongo que existen códigos / métodos existentes que pueden aplicar una función / método en todos los títulos.

BaronGrivet
fuente
1
Escribiría una forma de bucle desde cero. Debería ser bastante simple, pero si desea reutilizar el código del complemento, publique las partes relevantes.
s_ha_dum
¿Supongo que los títulos se agregaron manualmente en mayúsculas?
Brad Dalton
@BradDalton: eso es correcto, se acostumbró a escribir los títulos de su artículo / blog en MAYÚSCULAS.
BaronGrivet
¿Ya has encontrado una solución para esto?
Brad Dalton el
@BradDalton: sí, la solución que seleccioné a continuación "Actualización de las publicaciones"
BaronGrivet

Respuestas:

19

Actualizando las publicaciones

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

Convertir una cadena a "Caso de título"

Y, aunque no es pertinente para WP, en aras de la integridad:

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, ambas listas de palabras podrían expandirse: la lista en minúsculas, especialmente por más preposiciones, los acrónimos de aquellos que se usan a menudo en el sitio actual.

Sin embargo, la parte específica de WP es solo el bloque de código superior.

Johannes Pille
fuente
1
Un título con WordPress, MySQL y OpenOffice : D
fuxia
: D Solo vi esto 2 días. Sí, eso es un problema ...
Johannes Pille
¿Cómo encaja la parte "Actualizar las publicaciones" en mi archivo de plantilla en lugar de <?php the_title(); >?
Pete
9

Puede cambiar el título de la publicación cuando se ve:

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

Esto es solo una idea, basada en esta respuesta . No se ha probado .

fuxia
fuente
Funciona bien para mi
Pete
0

Una "solución" rápida sería a través de CSS utilizando text-transform .

text-transform: capitalize;

Sin embargo, sería mejor si pudieras cambiar las mayúsculas en la base de datos ya que esto es una cuestión de estilos, no de contenido :) Si quieres títulos en mayúsculas, ¡hazlo a través de CSS o tendrás este tipo de problema!

Nahuel
fuente
1
Esto solo puede poner en mayúscula las palabras en minúscula, no las palabras que ya están en mayúscula.
Pete
0

Esto funciona sobre una base de referencia de título individual por título

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

strtolower convierte el título en minúsculas. Entonces el ucwords lo hace apropiado

Jon
fuente