Comment changer la casse de tous les titres de message en «Titre cas»

13

J'aide mon père avec son site WordPress.
Il compte plus de 1 700 publications avec des TITRES EN MAJUSCULE.

Nous aimerions les changer en "Title Case" dans la base de données (éventuellement en utilisant ce script PHP ).

Le plug-in WordPress "To Title Case" modifie la casse au niveau du modèle - nous aimerions le changer au niveau de la base de données.

Quelle serait la meilleure façon d'appliquer le script à tous les titres de la base de données WordPress?
Je pourrais écrire du code à partir de zéro, mais je suppose qu'il existe du code / des méthodes qui peuvent appliquer une fonction / méthode à tous les titres.

BaronGrivet
la source
1
J'écrirais un scratch de forme en boucle. Cela devrait être assez simple, mais si vous souhaitez réutiliser le code du plugin, postez les parties pertinentes.
s_ha_dum
Je suppose que les titres ont été ajoutés manuellement en majuscules?
Brad Dalton
@ BradDalton - c'est exact, il a pris l'habitude de taper ses titres d'article / blog en MAJUSCULES.
BaronGrivet
Avez-vous déjà trouvé une solution à cela?
Brad Dalton
@BradDalton - oui, la solution que j'ai choisie ci-dessous "Mise à jour des messages"
BaronGrivet

Réponses:

19

Mise à jour des messages

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

Conversion d'une chaîne en "Case Titre"

Et, bien que cela ne soit pas pertinent pour WP, par souci d'exhaustivité:

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

Évidemment, les deux listes de mots pourraient être étendues - la liste en minuscules en particulier par plus de prépositions, les acronymes par ceux qui sont souvent utilisés sur le site actuel.

Cependant, la partie spécifique à WP n'est que le bloc de code supérieur.

Johannes Pille
la source
1
Un titre avec WordPress, MySQL et OpenOffice : D
fuxia
: D Seulement vu ce 2 jours. Oui, c'est un piège ...
Johannes Pille
Comment la partie "Mise à jour des publications" s'inscrit-elle dans mon fichier modèle à la place de <?php the_title(); >?
Pete
9

Vous pouvez modifier le titre du message lorsqu'il est affiché:

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

Ce n'est qu'une idée, basée sur cette réponse . Non testé .

fuxia
la source
Fonctionne bien pour moi.
Pete
0

Une "solution" rapide serait via CSS en utilisant la transformation de texte .

text-transform: capitalize;

Cependant, il serait préférable de modifier la capitalisation de la base de données car c'est une question de styles, pas de contenu :) Si vous voulez des titres en majuscules, faites-le via CSS ou vous aurez ce genre de problème!

Nahuel
la source
1
Cela ne peut mettre en majuscule que des mots en minuscules, pas des mots qui sont déjà en majuscule.
Pete
0

Cela fonctionne sur une base de référence titre par titre

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

strtolower transforme le titre en minuscules. Ensuite, les ucwords le rendent approprié

Jon
la source