web-dev-qa-db-ja.com

500文字ごとにPostコンテンツを別々のdivに分割します(またはその他の文字数)

1つの投稿ページの投稿のthe_contentをインターセプトし、500文字(または他の任意の文字数)のセクションにthe_contentを分割してから、独自のdivコンテナーでラップされた各500文字のセクションを出力する最も良い方法は何ですか?

私は、get_the_content()が投稿コンテンツを変数に格納できる文字列として返すことを理解しています。しかし、PHPの初心者なので、文字数に基づいてコンテンツをセグメント化する方法についてはよくわかりません。文字数は、次のようにして取得できます。

    <?php
      $content = get_the_content();
      echo strlen($content);
    ?>

しかし、それは私の知る限りです。誰もがこの挑戦を手伝ってくれる?

UPDATE:Lukas Kolletzkiのstackoverflowの助けを借りて、私はこれまでに得たことがあります。

    <?php
    $content = get_the_content();
    $chunks = str_split($content, 500);

    //Printing each chunk in a div
    foreach($chunks as $chunk_content) {
        echo "<div>";
        echo $chunk_content;
        echo "</div>";
    }
    ?>

これにより、投稿コンテンツが500ワードのセクションに分割され、それぞれが別々のコンテナにラップされます。

さらに進んで、Lukasはwordwrap()およびexplode()関数を使用して単語が半分にならないようにすることを提案しました。

    <?php
    $content = get_the_content();
    $strings = wordwrap($content, 500, "<br />"); //Put a {BREAK} every 500 characters
    $chunks = explode("<br />", $strings); //Put each segment separated by {BREAK} into an array field

    //Printing each chunk in a div
    foreach($chunks as $chunk_content) {
        echo "<div class="post-content">";
        echo $chunk_content;
        echo "</div>";
    }
    ?>

これは非常にうまく機能しますが、今私は通常のワードプレスが

タグは出力されていません。これは、get_the_content()がHTMLなしでテキストのみを出力するためですか。

段落を投稿内容に戻しても上記の機能を維持するにはどうすればよいですか。

もう一度ありがとう、そしてこれを重複とマークしないでください。それはexcerpt_lengthフィルターの質問とはかなり異なる質問です。あるいは少なくとも私はそう思います。

1
user2655393

@kaiserと@ t31osが貢献してくれたすべてのフィードバックと回答に本当に感謝しています。私はPHPがおかしいので、kasierとt31osの答えを使って作業ブロックのコードをまとめるのは困難でした。それは非常に才能のあるコーダーではないことの私のせいです:

しかし、PHP.netで独自の調査を行い、StackOverflowで同様の質問をすることで、私が思いついた解決策を投稿したかったのです。

以下は、当初の目的を達成するために使用しているコードです。

    <?php
    $content = get_the_content();
    $strings = wordwrap($content, 500, "<!--break-->"); //insert this every 500 chars, but preserve whole words.
    $chunks = explode("<!--break-->", $strings); create a new string of 500-char sections.

    ob_start(); // buffer the output of the following expressions...
    foreach($chunks as $chunk_content) {
        echo '<span>'; // use <span> instead of <div> so as to not interrupt the paragraph formatting of the content when viewed normally (graceful degradation).
        echo $chunk_content;
        echo '</span> ';
        }
    $segmented_content = ob_get_contents(); // put the results of the above expressions into a variable.
    ob_end_clean(); // discard the expressions that were buffered.
    echo nl2br($segmented_content); // put the result through a filter which replaces line-breaks with <br> tags.
    ?>

ノート:

  • このコンテンツのセグメント化の目的は、BookBlockページフリッププラグインで使用される個別のフレームまたは「ページ」を作成することです(詳細については、この---(codropsチュートリアル をご覧ください)。 500文字の各セクションは「ページ」として扱われ、ページ上のナビゲーションコントロールにより、ユーザーはNice CSS3 3D変換トランジションでページをめくることができます。

  • <span>コンテナーを使用して出力をラップしました。これは、このメソッド自体が適切に劣化するためです。ユーザーのデバイスがJavascriptまたはいくつかの重要なCSS3プロパティをサポートしていない場合、Modernizerはそれを検出し、CSSは適応し、コンテンツの通常のページを表示します。個別のフレームに分割されず、この場合<span> tコンテンツの通常の段落構造を混乱させる。

  • 500文字のすべてのセクションを1つの変数にコンパイルして、最終出力用のnl2br();フィルターに渡すために、出力バッファリングを使用しました。

  • 最初にwpautop();フィルターを使用して、出力で段落が適切にレンダリングされるようにしましたが、<span>タグと<p>タグは重複できないことをすぐに思い出しました:-Pそして、wpautop();フィルターを各500に適用した場合-charセクションを個別に指定すると、文の途中で<p>タグが出力される場合がありました。解決策は、コンテンツの改行ごとに<br>タグを追加するためにnl2br();フィルターを使用することでした。これは、終了タグを必要としないため、500文字のコンテナーを中断せずに段落構造を維持します。

質問:このコードは機能し、トラフィックが多くないWebサイトで使用されます(1日あたりのアクセス数が50未満の可能性があります)。しかし、私はまだ(PHPについてあまり詳しくないので)このコードが遅く、非常にエレガントではないのではないかと心配しています。

カイザーとt31osが答えでどのように推奨するかを正確に知っていると仮定すると、それらのソリューションは計算速度のために優れています(つまり、サーバー要求、dbクエリ、コードなどが少なくなります)?または、私のソリューションは同じくらい良いですか?

1
user2655393

get_the_content()はエディタの内容を返しますが、wpautopフィルタなどはthe_contentに添付されています(これは分割関数の中では必要ありません。後で手動で適用するだけです)。

apply_filters( 'the_content', $output );

最後に。

分割する前にstrip_shortcodes( get_the_content() );を使うべきです:

$output = get_the_content();
$output = wp_trim_words( $output, 500 );

あなたがコンテンツとarray_Push()をあなたの$output = array();に持っている限り、あなたはそれをループする必要があるでしょう。

1
kaiser

User2655393からのリクエストによれば、私は 自分のコードのバージョン を出力しました。これは出力バッファリングを使用しませんが、代わりに文字列連結を使用します。

$content = get_the_content();
$strings = wordwrap($content, 500, "<!--break-->"); //insert this every 500 chars, but preserve whole words.
$chunks = explode("<!--break-->", $strings); create a new string of 500-char sections.  
$segmented_content = '';
foreach($chunks as $chunk_content) {
  $segmented_content .= '<span>'; // use <span> instead of <div> so as to not interrupt the paragraph formatting of the content when viewed normally (graceful degradation).
    $segmented_content .= $chunk_content;
  $segmented_content .= '</span> ';
}
echo nl2br($segmented_content); // put the result through a filter which replaces line-breaks with <br> tags.
1
s_ha_dum