问题描述

我正在用他的 WordPress 网站帮助我的父亲。它拥有超过 1700 个职位,拥有 TITLES IN UPPERCASE 。

我们想将这些更改为数据库中的”Title Case”(可能使用 this PHP script) 。

WordPress「到标题案例」plug-in 在模板级更改大小写 – 我们想在数据库级别更改它。

将脚本应用于 WordPress 数据库中的所有标题是什么?我可以从头开始编写一些代码,但我猜测现有的代码/方法可以在所有标题中应用一个函数/方法。

最佳解决方案

更新帖子

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

将字符串转换为”Title Case”

而且,与 WP 无关,为了完整起见:

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

显然,这两个单词列表可以扩展 – lower-case 列表尤其是更多介词,这些列表在当前站点上经常使用的首字母缩略词。

无论如何,WP-specific 部分只是上层代码块。

次佳解决方案

您可以在查看帖子时更改帖子标题:

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

这只是一个基于 this answer 的想法。没有测试。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。