【至急・重要】ウィルスチェックのお願い

Change Style


WP plugin: 記事にタグ付け - Ultimate Tag Warrior 4) 本体のカスタマイズ

この章では、WordPress・UTW・他のプラグイン本体の動作を変えるカスタマイズについてメモしていきます。

:!: 危険: オススメできません (>_<)

  • この記事は、WP・PHP・MySQL 初心者なぼのが自己流で行ったカスタマイズについて書いています。
  • 理屈抜き・検証不十分・一応動いてはいるけどこんなんでいいのかなあ。。。(゜~゜) という、危険度・ぼのぼの度ともに 100% な代物です。「こんなチャレンジャーもいるんだなあ」程度に見ていただければ幸い。
  • 「仕方ねえなあ。アドバイスしてやるか。」と思っていただけたら、さらに幸せです。(*’-'*)
  • 以上を理解した上でこれを試そうという勇者なお方は、自己責任で。ぜひぜひ、ご自身で十分に検証を行ってくださいー。

Custom Query String Plugin 対応

問題点・実現したいこと
  • CQS のオプションで is_home() を設定すると、この設定内容が is_tag() にも適用されてしまう。トップページを 3件に設定したら、タグアーカイブページ1 も 3件しか表示されなくなってしまった。(;_;)
  • is_tag の表示オプションも設定できるようにしたい。
修正内容
  • 2006.6.29(WP ME 2.0.3+UTW 3.1+CQS 2.7)に行った対応を、そのまま ME 2.0.4 にも適用。2.0.4 では不適切な箇所があるかも。
  • それらしいところをいじったら上手く動いた、ラッキーパンチ!的カスタム。CQSの表示件数の指定とコンディショナルタグとの連携の仕組みがなかなか理解できません。。。解説求むです。。
    たーすけてーー(・;)
  • is_tag() 自体は wp-contents/plugins/ultimate-tag-warrior.php 106行目で定義されている。
    function is_tag() {
        global $utw;
        return ( count($utw->GetCurrentTagSet() ) > 0);
    }
  • wp-content/plugins/custom-query-string.php
    • 52行目で CQS オプション画面の Condition の選択肢を定義している。'is_tag' を追加。
      var $conditions = array('is_archive', 'is_author', 'is_category', 'is_date', 'is_year', 'is_month', 'is_day', 'is_time', 'is_search', 'is_home', 'is_paged', 'is_feed', 'is_tag');
    • function get_query() によって表示のコントロールを実現しているっぽい。190行目に次のコードを挿入。2
      elseif ($wp_query->is_tag AND $this->options['is_tag'])
          $this->query = 'is_tag';
  • 上記 CQS 側の修正だけだと is_home の設定値(またはデフォルト表示件数)と同じ扱いになってしまう。
  • wp-includes/classes.php も修正。
    • 遠慮がちに 31行目に挿入。値の初期化。
      var $is_tag = false;
    • 52行目付近に挿入(上で行を追加した後なので、行番号は多少前後する。以下同様)。これも値の初期化?
      $this->is_tag = false;
    • 240行目付近に挿入。この条件だったらタグ(アーカイブ)ページと判断する。function is_tag() の判断を真似っこ。いいのか?こんなんで…。(^^;
      global $utw;
      if (count($utw->GetCurrentTagSet()) > 0) {
          $this->is_tag = true;
      }
    • 246行目(元239行目)付近。この条件以外は is_home にもフラグが立ってしまうようなので、$this->is_tag を追加。
      if ( ! ($this->is_attachment || $this->is_archive || $this->is_single || $this->is_page || $this->is_search || $this->is_feed || $this->is_trackback || $this->is_404 || $this->is_admin || $this->is_comments_popup || $this->is_tag ) ) {
          $this->is_home = true;
      }

「ページ」対応

# 記事に切り替えれば話が早いのでは……とも思う。(^-^;

「ページ」作成画面に Tags 欄を追加
問題点・実現したいこと
  • ページ作成画面に Tags 欄がないため、タグ付けが出来ない。
  • Inline Tag Adder でタグをつけても、ページを更新すると消えてしまう。これも Tags 欄がないからクリアされちゃうんだと思う。
修正内容

修正対象は WP ME 2.0.4+UTW 3.1。2006.9.6 実施。

  • wp-content/plugins/UltimateTagWarrior/ultimate-tag-warrior-actions.php 810行目付近
    // Add or edit tags
    add_action('simple_edit_form', array('UltimateTagWarriorActions','ultimate_display_tag_widget'));
    add_action('edit_form_advanced', array('UltimateTagWarriorActions','ultimate_display_tag_widget'));
    add_action('edit_page_form', array('UltimateTagWarriorActions','ultimate_display_tag_widget')); ←この行を追加
  • ページ作成画面で付けたタグのセーブは、edit_postsave_post あたりでできているみたい。
タグアーカイブにページも表示
問題点・実現したいこと

タグアーカイブページには「記事」しか表示されない。「ページ」も表示させたい。

修正内容
  • 修正対象は WP ME 2.0.4+UTW 3.1。2006.9.6 実施。
  • WP コアで、DB から記事を読み出すクエリの WHERE 節(抽出条件)は、wp-includes/classes.php 625行目(CQS 関係修正前だと 616行目付近) の $where = apply_filters('posts_where', $where); の前で作られている。この WHERE 節は、plugin API の add_filter(’posts_where’) を用いると、WPコアを触らずにプラグイン側で変更できる。(のかなあと解釈。)
  • UTW ではwp-content/plugins/UltimateTagWarrior/ultimate-tag-warrior-actions.php 825行目付近に add_filter('posts_where') がある。
    // Display tag pages
    add_action('template_redirect', array('UltimateTagWarriorActions','ultimate_tag_templates'));
    add_filter('posts_join', array('UltimateTagWarriorActions','ultimate_posts_join'));
    add_filter('posts_where', array('UltimateTagWarriorActions','ultimate_posts_where')); ←コレ 
    // add_filter('posts_having',array('UltimateTagWarriorActions','ultimate_posts_having'));
    posts_where が hook 名。フィルター名のところが array(~) になっているのはよく分からない。。。
  • 実際に WHERE 節を編集しているのは 751行目の function ultimate_posts_where($where)
    デフォルトの WHERE 節の一部を置換する文を 760行目に入れてみた。
    $where = str_replace(' AND (post_status = "publish"', ' AND ( (post_status = "publish" or post_status = "static") ', $where);
未解決

検索結果表示ページと同様に、「ページ」のときは投稿日付とカテゴリを非表示にしたい。一般のアーカイブページでは、「ページ」かどうかの判断に $post->post_status が使えるが、タグアーカイブページでは効かない。 $post の替わりに何を使えばいいか。

その他

  • Breadcrumb Navigation XT — タグアーカイブは対象外なので、if 文を使って独自にナビを出力。
  1. http://~/tags/タグ名/ のページ[back]
  2. is_archive と設定を兼ねられればベストだと思って、elseif ($wp_query->is_archive) の内側に挿入した上で is_archive の件数を設定してみたが、デフォルト(管理パネル > オプション > 表示設定のブログページ最大表示数)が適用されてしまった。そのため、その前に書くこととした。処理順序が重要なので、私の設定値ではこれで上手く動いたが、設定する Condition によっては挿入位置の微調整が必要かも。ソース 173行目の注釈参照。[back]

3 Responses to “WP plugin: 記事にタグ付け - Ultimate Tag Warrior 4) 本体のカスタマイズ”

  1. ページ毎に表示件数を変える Plugin:Custom Query String を入れてみた。 « affection. :

    [...] WP plugin: 記事にタグ付け - Ultimate Tag Warrior 4) 本体のカスタマイズ [...]

  2. ページ毎に表示件数を変える Plugin:Custom Query String を入れてみた。 « kappadow.jp :

    [...] WP plugin: 記事にタグ付け - Ultimate Tag Warrior 4) 本体のカスタマイズ [...]

  3. ページ毎に表示件数を変える Plugin:Custom Query String を入れてみた。 - kappadow.jp :

    [...] WP plugin: 記事にタグ付け - Ultimate Tag Warrior 4) 本体のカスタマイズ [...]

コメントをどうぞ