サポート » その他 » functions.phpでHTMLを置換したい(フィルターフックうまくいきません)

  • 解決済 greon999

    (@greon999)


    functions.phpでHTMLを置換したいと思っています。
    具体的な目的としては、自作のカスタム投稿ページの時だけ</title>や</h1>を○○</title>や○○</h1>としてテキストを追加したいのです。

    http://web-pc.net/wp010
    を参考し、以下のように記述したのですが、文字列は置換される(’変更前’ => ‘<p>変更後</p>’)もののHTMLは置換されません。文字列にHTMLは追記できますが、HTMLに文字列の追記ができません。

    function change_any_texts($text){
    	if(is_singular('custom')) {
        $replace = array(
            '</h1>' => 'aaa</h1>',
            '変更前' => '<p>変更後</p>'
        );
        $text = str_replace(array_keys($replace), $replace, $text);
        return $text;
    	}else{
    	}
    }
    add_filter('the_title', 'change_any_texts');

    ※customはカスタム投稿名です

    テーマは自作ではなく、子テーマで作成しているのでsingle.phpは触らないようにと思っています。

    また、2000ほどある投稿の</title>や</h1>で囲まれた文字列を変更するのが目的で、その文字列に共通点はなく、手作業で2000回やるのは困難なので、</title>や</h1>の直前にテキストを追記するのが良いと考えました。(追記するテキストはすべて同じです。市区町村のタイトルに対し○○支店、△△支店、□□支店・・・というようなイメージです。その 支店 を追記したいのです。)

    お知恵をお貸しいただけると幸いです。
    不足している情報などございましたら、遠慮なくご指摘ください。
    何卒よろしくお願いいたします。


    wordpressバージョン 4.9.6 、対象のテーマは cocoon です。

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

    (@greon999)

    追記です。
    少しでも軽量化、および製作段階での設定工数を極力減らしたいと思っていますので、プラグインでの対応ではないようにしたいと思っています。

    cocoon について存じ上げませんが、例えばテーマ Twenty Seventeen の場合、単一投稿ページの投稿タイトルはテンプレートに下記のコードが直書きされています。

    if ( is_single() ) {
    	the_title( '<h1 class="entry-title">', '</h1>' );
    }
    

    このように <h1> はタイトルそのものと別に指定されるので、フィルター the_title は効きません。cocoon がもし同様に the_title() や get_the_tille() を使っているなら、single.php のコードを子テーマで変えるのが良いと思います。(single-custom.php を作る。)

    また <title> タグは wp_head() 関数が出力します。この関数を使うのが WordPress の一般的なテーマの作法です。cocoon が同様に作られているなら wp_head() の動作を決めるアクション wp_head を利用していると思いますので、これも子テーマで変えるのが良いと思います。(</title> を置き換える代りに元の文字列の後ろへ付加する。)
    参考: WordPress4.4以降でtitleタグをカスタマイズする方法 | Glatch(グラッチ) – 夫婦で活動するフリーランスWeb制作ユニット

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

    (@greon999)

    >gblsm様

    ご回答ありがとうございます。
    参考URLを元に、titleタグに関しては目的を達成できました!
    以下に作成したものを記載いたします。

    function my_pre_get_document_title( $title ) {
    	if ( is_singular('custom') ) {
    	$title = get_the_title().'追加テキスト';
    	}
    	return $title;
    }
    add_filter( 'pre_get_document_title', 'my_pre_get_document_title' );

    h1に関してはどうしても無理でした。
    cocoonはh1にthe_title()を使っている仕様のようでした。single-custom.phpを作成することも考えましたが、どうも特殊な構造で、single.phpの内部は他のphpファイルから読み込み読み込みでした。single-custom.phpを作っても読込先ファイルのh1の箇所を変更しなければいけなくなるので、他ファイル全てに影響すると思われる仕様でした。
    結果その読み込み先のファイルに条件分岐でカスタム投稿のときだけ任意のテキストが表示されるようしました。親テーマがアップデートしたら都度変更しなければいけない煩わしさは残りましたが、仕方ないです・・・。

    目的は達成できましたので、本件解決とさせていただきます。
    ありがとうございました!

    解決して良かったです。

    どうも特殊な構造で、single.phpの内部は他のphpファイルから読み込みでした。

    Twenty Seventeen の single.php に含まれる下記コードと似ていますか?

    get_template_part( 'template-parts/post/content', get_post_format() );
    

    cocoon が同様に get_template_part() を利用しているなら、子テーマに同じフォルダーを作り同じファイル名で新しくphpファイルを作れば、子テーマでは子テーマ側のphpファイルを読み込んでくれますよ。
    下記の「子テーマでloop.phpを利用する」が参考になると思います。
    https://wpdocs.osdn.jp/関数リファレンス/get_template_part#Using_loop.php_in_child_themes

    • この返信は4年、 6ヶ月前にgblsmが編集しました。
4件の返信を表示中 - 1 - 4件目 (全4件中)
  • トピック「functions.phpでHTMLを置換したい(フィルターフックうまくいきません)」には新たに返信することはできません。