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.


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.


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é .


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!


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é

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.