• 解決済 ringoame

    (@ringoame)


    記事の文字数を表示したい。

    お世話になっております。
    投稿画面において記事の文字数が左下にカウントされていますが、その文字数を取得して表示したいです。
    WP Multibyte Patchで色々ググりましたが解決に至らず、質問させて頂きました。

    具体的には固定ページの親ページで子ページの一覧を表示しており、その中で情報の一つとして子ページの文字数を表示させたいです。
    現在は指南サイト様を参考にさせて頂き、ひとまず子ページの文字数を表示する事はできています。
    (Post Snippetsを使用しています。)

    <?php
    $args = array(
    'post_type' => 'page', 
    'post_parent' =>{xxx},
    'order' => 'ASC',
    'posts_per_page' => 10,  
    
    );
    $the_query = new WP_Query( $args ); ?>
    <dl>
    <?php if ( $the_query->have_posts() ) :
    while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
    <dt><a href="<?php the_permalink() ?>" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></dt>
    <dd>
    <?php echo post_custom('xxx'); ?>
    </dd>
    <dd><?php the_time('Y.m.d'); ?></dd>
    <dd>
    <?php
    global $post;
    	$text = $post->post_content;
    	preg_match_all( "/<[a-zA-Z0-9\s=':;,{}#$%&@~<>\"\!\?\|\/\._\-\( \)\\\[\]]+>/" , $text , $match );
    	for( $i=0; $i < count( $match[0] ); $i++ ){
    		$removal_all = $removal_all + mb_strlen( $match[0][$i] , "UTF-8" );
    	}
    	$content_text = mb_strlen( $text , "UTF-8" ) - $removal_all;
            echo "文字数 約:" .  $content_text . "";
    ?>
    </dd>
    	
    </dd>
    <?php endwhile; ?>
    <?php endif; ?>
    <?php wp_reset_postdata(); ?>
    <dd>
    </dd>
    </dl>

    表示は出来ていますが誤差が相当数あるので、できれば投稿画面の左下に表示される文字数を表示したいです。
    可能でしたらご教示頂けないでしょうか。よろしくお願いします。

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • トピック投稿者 ringoame

    (@ringoame)

    タグを間違っていたので再度貼らせて頂きます。すみません。
    引き続きよろしくお願いします。

    <?php
    $args = array(
    'post_type' => 'page', 
    'post_parent' =>{xxx},
    'order' => 'ASC',
    'posts_per_page' => 10,  
    
    );
    $the_query = new WP_Query( $args ); ?>
    <dl>
    <?php if ( $the_query->have_posts() ) :
    while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
    <dt><a href="<?php the_permalink() ?>" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></dt>
    <dd>
    <?php echo post_custom('aaa'); ?>
    </dd>
    <dd><?php the_time('Y.m.d'); ?></dd>
    <dd>
    <?php
    global $post;
    	$text = $post->post_content;
    	preg_match_all( "/<[a-zA-Z0-9\s=':;,{}#$%&@~<>\"\!\?\|\/\._\-\( \)\\\[\]]+>/" , $text , $match );
    	for( $i=0; $i < count( $match[0] ); $i++ ){
    		$removal_all = $removal_all + mb_strlen( $match[0][$i] , "UTF-8" );
    	}
    	$content_text = mb_strlen( $text , "UTF-8" ) - $removal_all;
            echo "文字数 約:" .  $content_text . "";
    ?>
    </dd>
    <?php endwhile; ?>
    <?php endif; ?>
    <?php wp_reset_postdata(); ?>
    </dl>

    こんにちは

    タグを除去するphpの関数がありますよ。

    $content_text = mb_strlen( strip_tags($text) , "UTF-8" );
    という感じでしょうか。
    他にもスペースをエスケープした&nbsp;やアンバサンドをエスケープした&なんかも文字数を増やすと思いますので、置き換えたらいいかもしれません。

    Nora

    (@nora0123456789)

    こんにちは、通りすがりのものです。

    HTMLタグもそうですが、ショートコードも削除する必要性がある場合だと、manyagu様のコードに付け加えて、

    $content_text = mb_strlen( preg_replace( '/\[[^\]]+\]/i', '', wp_strip_all_tags( $text ) ), "UTF-8" );

    といった感じにしておくと良いかもしれません。正規表現はチェックしていませんので、間違っていたら修正してください。

    また、「投稿画面の文字数の取得」とありましたが、編集ページのことでしょうか?
    恐らく前者の方が簡単だと思いますが、「編集ページのエディタに表示される文字数」でしたら、JavaScriptでセレクタ「#wp-word-count > .word-count」のテキスト部分を取得(jQueryなら「jQuery( ‘#wp-word-count > .word-count’ ).text();」のような感じ)すればいいと思います。あとはこの値をカスタムフィールドとして保存すれば、「get_post_meta」などの関数でも取得できるようになるんじゃないでしょうか。

    • この返信は7年、 10ヶ月前にNoraが編集しました。
    トピック投稿者 ringoame

    (@ringoame)

    早速のご回答ありがとうございました。大変有り難いです。

    お二方の解説を読んで試してみましたが文字数はやはり誤差が出ます。
    あまりわかっていません。以下のような書き方で良いのでしょうか。

    <?php
    global $post;
    $text = $post->post_content;
    $content_text = mb_strlen( strip_tags($text) , "UTF-8" );
    $content_text = mb_strlen( preg_replace( '/\[[^\]]+\]/i', '', wp_strip_all_tags( $text ) ), "UTF-8" );
            echo "文字数 約:" .  $content_text . "";
    ?>

    投稿画面の文字数とは、仰るように「編集ページのエディタに表示される文字数」です。
    スクショ

    例えば上のスクショは文字数16,795ですが、実際の固定ページには17,921と表示されます。
    できれば文字数16,795と表示したいです。

    この文字数を一つ一つカスタムフィールドに保存という方法も考えましたが、ページ数が膨大なのであまり現実的ではありません。

    jQueryでテキスト部分を取得して――の方法だと「編集ページのエディタに表示される文字数」を、最初に貼ったコードに組み込み、固定ページに表示できるのでしょうか。
    直接的な質問で申し訳ありません。もしよろしければどなたかご教示頂けたら幸いです。

    コードが間違っていますね。

    mb_strlen( strip_tags($text) , "UTF-8" );が実行されなくなっていて、タグが残っているようです。

    <?php
    	global $post;
    	$text = strip_tags($post->post_content);
    	$text = preg_replace( '/\[[^\]]+\]/i', '', wp_strip_all_tags( $text ) );
    	echo "文字数 約:" .  mb_strlen($text, "UTF-8");
    ?>

    また、正しく文字数を取得るすのであれば、先ほどお伝えしたようにエスケープされたスペースやアンバサンドなども一文字に置き換えないといけませんし、タグが入ると同時に余分な改行が入っていることも考えられます。
    改行は文字数にカウントしないのであれば、全部削除すればいいですけれど。
    逆に、ダッシュボードのエディタでの数字は、ショートコードはそのままの文字数になっていませんか?
    $post->post_contentの中身では、ショートコードが実行されてた結果になっているのではと思いますので、管理画面の文字数と一致することはありえないと思います。

    ぴったり一致しないにしてもより近しい文字数を取得したいのであれば、上記コードでの最終的な$textの中身をダンプするなどして調整することが必ず必要だと思います。

    • この返信は7年、 10ヶ月前にmunyaguが編集しました。

    $post->post_contentは整形前ですね。
    失礼しました。

    タグを全部削除したら、逆に少なくなる気がしてきました・・・

    • この返信は7年、 10ヶ月前にmunyaguが編集しました。
    Nora

    (@nora0123456789)

    「jQueryでテキスト部分を取得して――の方法」の場合、編集ページに「HIDDENタイプのINPUTタグ」を出力しておき、アクションフック「save_post」でそのINPUTタグの情報を保存できるようにしておきます。

    // フォーム内であればどこでもいいと思いますが、ここではメタボックス「公開」内に出力するとします。
    add_action( 'post_submitbox_misc_actions', 'print_hidden_input' );
    function print_hidden_input( $post ) {
    
      $saved_data = get_post_meta( absint( $post->ID ), '_your_post_content_length', true );
      echo '<input type="hidden" name="your_post_content_length" id="your_post_content_length" value="' . $saved_data . '">';
    
    }
    
    add_action( 'save_post', 'save_hidden_input' );
    function save_hidden_input( $post_id ) {
      
      // ノンスチェック、サニタイズなど
    
      $data = absint( $_POST[ 'your_post_content_length' ] ); // 保存するデータ
      update_post_meta( $post_id, '_your_post_content_length', $data ); // 保存
    
    }

    あとは、jQueryで文字数を取得してINPUTタグに入れてしまう処理を書いて、フォーム送信前にトリガーされるようにすれば、うまく保存されるんじゃないでしょうか。

    上の保存処理が正常に行われていれば、公開ページ側で

    $post_content_length = get_post_meta( $post_id, '_your_post_content_length', true );

    のように取得して使うことが出来る筈です。

    ここで書いたコードは試していないためエラーがあるかもしれませんので、参考程度になればというものです。
    JSコードの方は、フォーム送信前に前回書いたセレクタ(#wp-word-count > .word-count)を使い、この方法で出力したINPUTタグを指定して文字数を格納することが出来れば問題ないと思いますよ。

    トピック投稿者 ringoame

    (@ringoame)

    詳細なご教示ありがとうございます。

    munyagu様
    今まで「エディタ画面の左下の文字数」が正確な文字数だと思っていたのですが、仰るようにショートコードの文字数も加算されていました。

    色々試してみた結果、近しい数字は無理かもしれないと感じました。
    現時点では多少の誤差は妥協して、また探っていきたいと思います。

    nora様
    ご丁寧にコードをご教示頂きありがとうございます。

    「あとは、jQueryで文字数を取得してINPUTタグに入れてしまう処理を書いて、フォーム送信前にトリガーされるように――」

    なるほど。この部分をスラスラと書けたら実現できそうなのですね。
    上記の件も含めて、これからまた調べて試してみます。

    解決して返事を書こうと思いましたが、時間がかかりそうなのでひとまず閉じさせて頂きます。
    ありがとうございました。

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • トピック「記事の文字数を表示したい。」には新たに返信することはできません。