ラベル フック の投稿を表示しています。 すべての投稿を表示
ラベル フック の投稿を表示しています。 すべての投稿を表示

2017年9月9日土曜日

【備忘録】WordPress の カスタムフィールドの日付で、日別アーカイブを生成するには

WordPress.org 日本語フォーラムで
という質問があり、実際に試して回答しました。
これについての情報が見当たらなかったので、ここで備忘録としてメモしておきます。どういう考えて修正してうまくいったのかも書き出しておきます。SQL文の勉強になるかもですよ! それに筆者も、またどこかで使えるかもしれませんので、残しておくのは役立ちます。

やりたいこと


記事のアーカイブを、各記事に設置した カスタムフィールド(date_field)に沿って、日別アーカイブ表示したいというもの

2017/09/02 (1)
2017/08/19 (2)
2017/07/02 (3)

とかそういう感じに出すってことです。
そして日付をクリックしたら、カスタムフィールド(date_field)の日付が一致したものの一覧がでるということですね。


がちょうど年月のアーカイブができるので、これに日をたせればできるんじゃない?ってことで実際にやってみました。

前提


管理ダッシュボード > 設定 > パーマリンク
で投稿に対して、日付(年月日)が付与されるようにしてください。



利用方法


Step 1. テーマの functions.php に下記のソースコードを追加


ソースコード:https://ideone.com/BavQDi

Step 2. 表示するコードを追加(例  index.php)


ここでは説明のために デフォルトテーマ「Twenty Seventeen」の index.php に書き込み、トップページの記事の一番上に表示するようにします。


下記のコードを図のように if ( have_posts() ) : の下に追加してみてください。

my_get_year_archives( array(
'date_field' => 'date_field',
) );




そうすればトップページに日付一覧が降順に表示されるはずです。

【WordPress】カスタムフィールドの日付でカスタム投稿の年月別アーカイブ(pronet)では、カスタムフィールド(date_field)は、YYYY/MM/DD (2017/07/02)を元にしていました。このあたりはいろいろ変更できます。
さて備忘録なので、実際にどういう変更をしたのかも説明しておきます。

変更点


変更1)カスタムフィールドの値から 年月だけでなく 日も取り出すSQL文に書き換える


$select = "SELECT SUBSTRING($field,1,4) AS `year`, SUBSTRING($field,6,2) AS `month`, SUBSTRING($field,9,2) AS `day`, count(p.ID) AS posts";

$query = "$select FROM $wpdb->posts AS p $join $where GROUP BY SUBSTRING($field,1,4), SUBSTRING($field,6,2), SUBSTRING($field,9,2) ORDER BY $field DESC $limit";


赤い部分の追加です。
YYYY/MM/DD 、1文字 = 1バイト(1バイト英数記号)と仮定すると、
  • 1,4 = 1文字目から4文字分(YYYY)
  • 6,2 = 6文字目から2文字分(MM)
ときたらもうわかりますよね。
  • 9,2 = 9文字目から2文字分(DD)
を付与すればよいということです。

※全角(日本語)のように 2017/08/19 とした場合に、SQLクエリの方でなんとかしたいなら、CATをつかうとよいようです。


変更2)HTMLコード出力に日データを追加


$url = add_query_arg( array( 'meta_key' => $date_field ), get_day_link( $arcresult->year, $arcresult->month, $arcresult->day) );

$text = sprintf( '%d', $arcresult->year ).'/'.sprintf( '%02d', $arcresult->month ).'/'.sprintf( '%02d', $arcresult->day );

->year, ->month, ->day の year, month, day については、変更1)の AS `year`、 AS `month`、AS `day` に紐付いています。

<li><a href='https://demo.dev/2017/09/02/?meta_key=date_field'>2017/09/02</a>&nbsp;(1)</li>
<li><a href='https://demo.dev/2017/08/30/?meta_key=date_field'>2017/08/30</a>&nbsp;(1)</li>
<li><a href='https://demo.dev/2017/07/02/?meta_key=date_field'>2017/07/02</a>&nbsp;(1)</li>

のようなコードが出力されます。

変更3)WordPress の検索クエリのカスタマイズに日を追加


下記の赤文字の部分が追加分です。
WordPress での投稿日付は、年 = year、 月 = monthnum、日 = day に保存されます。
ので下記のような追加になります。

function my_pre_get_posts( $query ) {
    if ( $query->is_day ) {
        $meta_query = array(
            array( 
                'key'     => $query->get( 'meta_key' ),
                'value'   => $query->get( 'year'     ).'/'.sprintf('%02d', $query->get( 'monthnum'     )).'/'.sprintf('%02d', $query->get( 'day'     )),
                'compare' => 'LIKE'
            ),
        );
        $query->set( 'meta_query' , $meta_query );
        $query->set( 'year'             , ''          ); 
        $query->set( 'monthnum'   , ''          );
        $query->set( 'day'   , ''          );
        $query->set( 'date'       , ''          );
        $query->set( 'meta_key'   , ''          );
        $query->set( 'post_type'  , 'post');
    }
}

2017.9.9 @kimipooh

2017年1月13日金曜日

【備忘録】WordPress 4.7.1 よりメディアアップロード時のMIMEチェックにファイル本体のチェック機能が付与されていた・・・

あれ、PDFやPPTXがアップロードできなくなってる、、、って思って調べてみた所、つまりはそういうことだったのです。風邪引いてフラフラなのにマイナーバージョンアップで久々にデカイ変更されたなーという感じです。

wp-include/functions.php
2323行〜2333行 ( wp_check_filetype_and_ext 関数内)


のコードが、付与されていたってことです。

何が違うの?

2016年6月27日月曜日

【備忘録】WordPressのログインパスワードリセットを制限する方法(メールアドレスだけOK)

単に使えないようにする情報は、結構掲載されています。
CSSで非表示にしたり、サーバー(htaccess含む)でリダイレクトしたり、WordPressのパスワード再発行のフック(allow_password_reset)で常に許可しない(false)を返すようにしたりと。

でも条件付きで許可する方法は探せませんでした。ので上記をヒントに、WordPressのコアコードを読んで検証してみました。その結果として、パスワードリセットを電子メールアドレスのみ有効にするという方法を紹介します。本件は、パスワード再発行について(WordPress.org 日本語版フォーラム)のやり取りにてうまくいったので備忘録を込めてここに纏めようと思いました。あとからわかったのですが、二通りのやり方がありましたし、コードももう少し洗練させたほうがいいなぁとも思いましたので。

以下のコードいずれかを「functions.php」 に追加することで、WordPressのパスワードリセットについてユーザー名に電子メールアドレスを使っている人だけ許可、それ以外は許可しないに設定できます。このコードの意味について順をおって説明します。

コード A(functions.php)

2015年5月7日木曜日

【修正されたバグ】サイトが非SSL、管理画面がSSL(/wp-admin/ 以下)の場合、メディア追加するとリンクがSSLに強制設定されてしまう

本件は、WordPress 4.2からのバグで、4.2.2で修正されています(5月7日)。
これに気づけず、フックを使ってあーでもない、こーでもないと修正してたんですが(末尾の付録参照)、勝手にリアルタイムで直ったので「アレレ??」って思ったんですよね。

今後も同じようなことが起こりそうなので、備忘録として残しておきます。

何が起こった?!


突然、独自ドメインに構築したWordPress上の「メディア」を使って追加した添付ファイルをダウンロードしようとすると、

---
この Web サイトのセキュリティ証明書には問題があります。
  (中略)
セキュリティ証明書の問題によって、詐欺や、お使いのコンピューターからサー
バーに送信される情報を盗み取る意図が示唆されている場合があります。
  (以下省略)
---

と「Internet ExplorerやChromeがいってきたけど、どういうこと?!」
って問い合わせが来たんですよね。

管理画面のみSSL暗号化(https:// アクセス)にしていて、SSL証明書に、オレオレ証明書(自己証明書)を使っている場合に起こる問題です。

2015年3月24日火曜日

Contact Form 7の 「input」タグに属性を追加する方法

Contact Form 7には、生成されるタグにclassやidを付与できます。
ただしこれは展開されると、<span class="◯◯"><input ..... ></span>など、spanタグで括られてしまいます。classなどはそれでもいいのですが、onClickとか付与したい場合どうしたらいい?

という質問があったので手持ち環境で試してみました。
以前、[resolved] Include Custom Shortcodes in Form? (WordPress Forum)にて、Contact Form 7の要素に対して何か処理する関数を作れることはわかっていたので、やってみました。

具体的に説明するため、

  • チェックボックスに「onClick="hogehoge(this,'t')"」 を付与する
方法を例に出して説明します。
つまり
  •  <input type="checkbox" ....> → <input onClick="hogehoge(this,'t')" type="checkbox" ...> 
にするこいうことです。

仕組み

2014年12月9日火曜日

他のプラグイン内に埋め込んだContact Form 7ショートコードを、Contact Form 7テンプレートに使うには #wpacja2014

 初めまして! WordPress Advent Calendar 2014 の9日目担当の木谷(@kimipooh)です。

さて、まず最初に本記事の英訳版を作成したことをお知らせします。

この記事自体は、結構前に仕上げていて8日になって、明日公開だよなぁ、、、これって結構面白いから英訳してみようかなぁ、、とかいうノリでやってしまったのでした。それほど高い英語能力はないのですが、正しく意味が通じたらいいかなと。

WordPress Advent Calendarは昨年初参加し、今年はネタがないよなぁと思っていたら、一つ思いついて実践してうまくいったので、それをネタに今年も参加してみました! 昨年公開したものは、「カレンダープラグイン「The Event Calendar」での日付降順処理 #wpacja2013」です。これは新サイトを立ち上げ時など、いまでも重宝してますし、こういったイベントで整理して発表することって後々まで役に立つんだなぁとしみじみと思い返しました。WordPressコミュニティとしては、WordBench京都大阪をフラフラ〜としてます。

前置きがいつも長くなってしまうのですが、そろそろ本題に入りたいと思います。
とてもわかりにくいタイトルですよね、、、。どう表現したらよいのかわからないので、そうなってしまいました。そもそもこんな需要あるのか!?という問題は、とりあえず脇においておきましょう。こういうことも出来るよっていう感じです。