サポート » 使い方全般 » functions.phpでウィジェットタイトルの初期値を書き換える

  • 解決済 Kite

    (@ixkaito)


    functions.phpでdefault-widgets.php内の各ウィジェットの$title部分を書き換えるにはどのようにすればよいでしょうか。
    ご教授のほどよろしくお願い致します。

12件の返信を表示中 - 1 - 12件目 (全12件中)
  • ixkaitoさん

    お使いのテーマはTwenty Twelveですか?
    だとしたら、たいていのデフォルトウィジェットは、管理パネルにて任意のタイトルをつけられるとおもうのですが(できないのは「リンク」くらいでしょうか?)、それではニーズが満たされないということでしょうか。

    具体的に、どのウィジェットのタイトルをカスタマイズしたいか示していただけると、何かヒントを提供できるかもしれません。

    ひょっとしたら、管理パネルにおけるウィジェットのタイトルを変えたい、ということでしょうか?

    説明不足で申し訳ございません。

    マルチサイトで複数ユーザーが同一テーマを使用するため、管理パネルで編集できないよう、テーマのfunctions.phpでウィジェットのタイトルを英語に固定したいと思っております。

    default-widgets.php内を編集すれば簡単ですが、WordPressのアップデートに対応できないため、テーマのfunctions.phpの方で書き換える方法をご教授いただきたいです。

    よろしくお願い致します。

    冗長になってしまいますが default-widgets.php にある各ウィジェットのコードをまるっと functions.php にコピーしたのち、適宜カスタマイズして widgets_init にフックしてはどうでしょう。

    例として、カスタマイズした「固定ページ」ウィジェットのコードを下記に載せました。default-widgets.php にある、元のコードと比較できるように diff で色分けしてみました。

    https://gist.github.com/4517015

    マルチサイト環境で試してないので、ご参考までに。

    《関連》
    Function Reference/unregister widget
    http://codex.wordpress.org/Function_Reference/unregister_widget

    ご回答ありがとうございます。
    コードも載せていただいて大変参考になりました。

    確かに全ウィジェットを書き換えたら冗長になってしまいますね。
    やはり$titleの部分だけを書き換えるのは難しいでしょうか。

    とりあえずはこちらの方法で実装させて頂きたいと思います。

    管理画面でのタイトル設定にかかわらず、サイト表示時にタイトルが固定になればよいのでしたら、ウィジェット部の出力文字列をいったんバッファにとりこんで置換した後に出力、という方法もありかとおもいます。

    sidebar.php にこんな感じで書くかたちになるかと。

    <?php
    ob_start();
    dynamic_sidebar( 'sidebar-1' );
    $out = ob_get_clean();
    
    $patterns = array(
    	'/(<aside.+?)(widget_pages">)(.+?)(<ul)/',
    	'/(<aside.+?)(widget_categories">)(.+?)(<ul)/',
    	'/(<aside.+?)(widget_nav_menu">)(.+?)(<div)/',
    	'/(<aside.+?)(widget_nav_calendar">)(.+?)(<div)/'
    );
    $replacements = array(
    	'$1$2<h3 class="widget-title">Pages</h3>$4',
    	'$1$2<h3 class="widget-title">Categories</h3>$4',
    	'$1$2<h3 class="widget-title">Menu</h3>$4',
    	'$1$2<h3 class="widget-title">Calendar</h3>$4',
    );
    echo preg_replace( $patterns, $replacements, $out );
    ?>

    これだと、置換前後の文字列を $patterns と $replacements に並べるだけなので functions.php に書くよりコードは多少すっきりするかもしれません。

    ただこの場合、管理画面でウィジェットのタイトルを任意で設定できてしまうので、「設定したのにページに反映されない!」とユーザーの方から言われちゃう可能性はありますが……

    こんにちは、

    ユーザーのスキルにもよると思いますが、スタイルで、非表示にしてしまって、ドラッグドロップだけ出来るようにしておくのが簡単ではないでしょうか、

    add_action('admin_head-widgets.php', 'widget_title_hide');
    
    function widget_title_hide(){
    ?>
    <style>
    .widget-content:first-child{
    
    	display:none;
    }
    </style>
    <?php
    }

    teckingさん、nobitaさん、ご回答ありがとうございます。
    ご返信遅くなりまして申し訳ございません。

    サンプルソースありがとうございます。利用させていただきます。

    My_Widgetなどを作ってフックするか、出力前に置き換えるか悩むところです。
    プログラミング上前者の方が正しいように思いますが、
    タイトルだけのために長いソースを書かないといけないのもなんだかなぁ。。。

    非表示でしたら、filterで一括でできますが、それぞれを置き換えるのも同じ要領でできるものかなと思っていましたが、そういう訳ではないんですね。

    このたびは大変ありがとうございます。
    引き続きもしもっとスマートな方法があればご教授ください。
    よろしくお願い致します。

    それぞれを置き換えるのも同じ要領でできるものかなと思っていましたが、そういう訳ではないんですね。

    スマートではないですし、一押しなどというつもりもありません
    私のは、「なんちゃってー」な方法でしかないですが、

    書き換えについては、下のようにしておけばいいです。

    <?php
    add_filter( 'widget_title', 'my_widget_title' );
    function my_widget_title($content){
      $before = array('Calendar');
        $after = array('暦');
    	$content = str_replace($before, $after, $content);
    	return $content;
    }
    ?>

    きっちりやるなら、やっぱりウィジェット作ってしまうとかが、いいと思います。

    返信が遅くなりまして大変申し訳ございません。
    再度アドバイスいただきましてありがとうございます。

    ちなみに今回の件については、ウィジェット自体にも少しカスタマイズが必要でしたので、
    新たにウィジェットを作ることにしました。

    なお、勉強としてnobitaさんの方法についてお伺いしたのですが、
    上記の場合Calenderが暦に置き換わるということですよね?

    カレンダーのデフォルトはタイトル表記なしなので、
    例としてあまり良くないかもしれないので、固定ページを例とした場合、
    「ページ」などに置き換えれば「ページ」が出力されると思いますが、
    もし「Pages」を表示させたい場合、「Pages」のまま置き換えても、
    翻訳されて「固定ページ」とはならないでしょうか。

    もし難しい問題であれば、無視してください。
    本来の目的は達成できておりますので。

    teckingさん、nobitaさんありがとうございました。

    上記の場合Calenderが暦に置き換わるということですよね?

    はい、そういうことです。

    フィルタなので、翻訳とかが終わって、最終的に出力する値を書き換えるという意味です。
    en_US環境なら、Pagesを、俺の固定ページ に書き換えるとか、jaなら固定ページを、俺の固定ページに書き換える作業をしています 🙂

    このフィルタだけだと、「ウィジェットのタイトルを書き換えたのに、強制的に戻されたとか、」面倒な事を避けるために、cssで入力するところをなくしてしまおうぜ、という思い付きでした

    フィルタなので、翻訳とかが終わって、最終的に出力する値を書き換えるという意味です。

    そうだったんですね!

    en_US環境なら、Pagesを、俺の固定ページ に書き換えるとか、jaなら固定ページを、俺の固定ページに書き換える作業をしています 🙂

    ということはコアファイル、翻訳ファイルを一切弄らずに英語表記にする場合は

    $before = array('固定ページ');
    $after = array('Pages');

    になるということですね。

12件の返信を表示中 - 1 - 12件目 (全12件中)
  • トピック「functions.phpでウィジェットタイトルの初期値を書き換える」には新たに返信することはできません。