• 解決済 yuki

    (@yuki84yuki)


    本文出力時に文字を追加したい時、例えば

    
    add_filter('the_content', 'hoge');
    function hoge( $content ) {
      return '★'.$content;
    }
    

    という風にフィルターフックで出来ると思いますが、
    これだとpタグの外に連結されます。
    pタグが付く前の本文に対して処理したい場合は
    どのようにすればよいのでしょうか?

12件の返信を表示中 - 1 - 12件目 (全12件中)
  • こんにちは

    それは WordPress ではなく php の技術で置き換えする他ないと思いますが、最初の P タグの後ろに ★ が来ればいいのであれば、
    return preg_replace( '/^<p>/', '<p>★', $content );
    という感じでしょうか。

    他にもやり方はあると思いますが。

    トピック投稿者 yuki

    (@yuki84yuki)

    ありがとうございます。
    WordPressでは無理なのですね。
    PHPでやることにします。

    こんにちは
    以下でどうでしょう?

    
    add_filter('the_content', 'hoge',9);
    function hoge( $content ) {
      return '★'.$content;
    }
    

    表示だけでいいのであれば、スタイルで追加するのもいいかもです。

    .entry-content p:before { content: "★"; }

    的外れな見解でしたら無視してください。

    トピック投稿者 yuki

    (@yuki84yuki)

    > munyagu(@munyagu)さん
    の方法を試しましたが置換されませんでした。
    何か間違いがあるでしょうか。

    // テンプレート内
    apply_filters('hoge', the_content());
    // function.php内
    add_filter('hoge', 'my_func', 10, 1);
    function my_func($content){
        return preg_replace( '/^<p>/', '<p>★', $content );
    }

    > nobita(@nobita)さん

    ありがとうございます。
    ただ、pタグの外に出力されます。
    なお、趣旨と外れますが、the_excerpt()だと
    謎の空白も入りますがpタグの内側になりました。

    > ishitaka(@ishitaka)さん

    ありがとうございます。
    それが一番簡単で確実かもしれません。
    完成したHTMLをテーマ化している途中なので、
    一度仕上げたCSSを変更しないで済む方法があるのか試行錯誤していました。
    ただ、どうしても無理そうなら、その方法で実現します。

    • この返信は4年、 12ヶ月前にyukiが編集しました。

    ただ、pタグの外に出力されます。

    wpautop()は、default-filters.phpでプライオリティが10でフィルターされているので、9でOKと思いましたが、もっと少ない数値にしてみるとpの内側に入るかもしれません。

    要は、wpautop()のフィルターが実行される前に、星を追加すればいいと思うので、、、

    CSSでもいいのであれば、その方がいいと思いますが、、、

    • この返信は4年、 12ヶ月前にnobitaが編集しました。
    トピック投稿者 yuki

    (@yuki84yuki)

    > nobita(@nobita)さん

    ありがとうございます。
    プライオリティを9~0まで試しましたが結果は変わりませんでした。

    コードから察すると、下記のようなことでしょうか?

    // テンプレート内
    apply_filters('hoge', the_content());


    echo apply_filters( 'hoge', get_the_content() );

    // function.php内
    add_filter('hoge', 'my_func', 10, 1);
    function my_func($content){
        return preg_replace( '/^<p>/', '<p>★', $content );
    }

    add_filter( 'hoge', 'my_func' );
    function my_func( $content ) {
    	$content = apply_filters( 'the_content', $content );
    	return preg_replace( '/^<p>/', '<p>★', $content );
    }

    @yuki84yuki さん

    あれ、ごめんなさい。

    一つ確認してもいいですか? エディタは、TinyMCEですか、ブロックエディタですか?

    TinyMCEだったら、wpautop()をテーマ内で直接使っていないですか?

    ブロックエディタだったら、プライオリティいじっても★は、pの外側になるので、
    (ブロックエディタの場合は、p要素は投稿にすでに書き込まれているので、常に外になっちゃいます)

    ブロックエディタなら、

    
    add_filter( 'the_content','my_content');
    
    function my_content($c){
    	return preg_replace('!<p>!','<p>★',$c,1);
    }
    

    第三引数は、置換のリミット

    CSSなら、

    
    p:first-child:before{
        content:'\2605';
    }
    
    
    apply_filters('hoge', the_content());
    

    the_content()は、間違いです echo する関数ではなく、get_the_content()等 returnする関数を使ってください。

    • この返信は4年、 12ヶ月前にnobitaが編集しました。
    • この返信は4年、 12ヶ月前にnobitaが編集しました。
    • この返信は4年、 12ヶ月前にnobitaが編集しました。
    トピック投稿者 yuki

    (@yuki84yuki)

    @ishitaka さん

    その認識の通りと思います。

    @nobita さん

    ブロックエディタで書いてます。

    > ブロックエディタの場合は、p要素は投稿にすでに書き込まれている

    なるほど、そのような仕様だったのですね。
    ご提示頂いたPHPのコードでうまくいきました。

    ちなみに「’!<p>!’」という正規表現は何を表しているのでしょうか?
    試しに「’/^<p>/’」を指定すると置換が行われませんでした。

    ちなみに「’!<p>!’」という正規表現は何を表しているのでしょうか?
    試しに「’/^<p>/’」を指定すると置換が行われませんでした。

    単にp要素を表します。

    '!^<p>!'だと、投稿本文の先頭にあるp要素という意味になるんだと思います。

    ただ、ブロックエディタは、コメントから始まるので、ヒットしないんじゃないかと思います。

    以下のように、マルチラインの修飾子をつけてやると、ヒットするかも

    
    add_filter( 'the_content','my_content');
    
    function my_content($c){
    	return preg_replace('!^<p>!m','<p>★',$c,1);
    }
    

    詳しくないので、
    https://www.php.net/manual/ja/reference.pcre.pattern.modifiers.php
    読んでみてください。

    • この返信は4年、 12ヶ月前にnobitaが編集しました。
    トピック投稿者 yuki

    (@yuki84yuki)

    > ブロックエディタは、コメントから始まるので

    失念しておりました。
    確かに段落だと”<!– wp:paragraph –>”で始まりますね。
    ‘!^<p>!m’でも上手くいきました。

    また、置換回数を1回とした上で、
    単純に’/<p>/’でも大丈夫でした。

12件の返信を表示中 - 1 - 12件目 (全12件中)
  • トピック「本文のpタグの中に文字を追加したい」には新たに返信することはできません。