っと、タイトルが長くなったけど、Contact Form 7、いつも大変便利にありがたく使わせていただいてます!!
ありがとうございます
以前、wpcf7_before_send_mailフックを使って投稿へ記事を放り込むようなものを作っていたのですが、今回も同様に、フォームからカスタム投稿タイプへ記事を送る機能を作る事になりました。
目次
upload_dirフックとwpcf7_before_send_mailとショートコードのデフォルト値
upload_dirフックを使って、uploads配下に投稿タイプ名のディレクトリにメディアをアップロードするまではスムーズに行ったんですが、カスタム投稿タイプのみならず、全ての投稿がそのディレクトリへアップロードされてしまって、ハマりました。
要は、カスタム投稿タイプ(my_post_type)の時だけ、upload_dirにフックさせれば良いのに、そのトリガーが上手く作れなかったわけです 😀
どうにかならないものかと思案していたところ、ありがたいドキュメントがありました!!
↑↑こちら。
[contact-form-7 …] ショートコードの属性値をフォームで使えたら便利なのに、と思うことがあるかもしれません。 そんな時はフォームタグのオプションとして default:shortcode_attr をセットしましょう。ショートコードの属性からデフォルト値を取得するようになります。
とあって、サンプルコードも載ってました!!
今回は、
[hidden your_post_type default:shortcode_attr]
と、hiddenフィールドを使いました。
で、フォームのショートコードに、
[contact-form-7 id="6" title="bbs" your_post_type="custom_post_type"]
と置いて、
if ( isset( $_POST['your_post_type'] ) && ! empty( $_POST['your_post_type'] ) && $_POST['your_post_type'] === 'custom_post_type' ) {
add_filter( 'upload_dir', 'change_upload_dir' );
}
っと、して特定の投稿タイプ時のみupload_dirでフックさせることができました 😀
.htaccessも設置
contact-form-7/modules/file.phpに.htaccessを設置するコードが載っていたので、真似て上記の投稿タイプ専用のディレクトリへ.htaccessを追加しました。
/**
* Make .htacces file to any directory.
*/
$htaccess_file = path_join( $upload['basedir'] . '/custom_post_type', '.htaccess' );
if ( ! file_exists( $htaccess_file ) ) {
if ( $handle = fopen( $htaccess_file, 'w' ) ) {
fwrite( $handle, 'SetEnvIf Referer "^' . untrailingslashit( home_url( '/' ) ) . '" ok_url' . "\n" );
fwrite( $handle, 'order deny,allow' . "\n" );
fwrite( $handle, 'Deny from all' . "\n" );
fwrite( $handle, 'allow from env=ok_url' . "\n" );
fclose( $handle );
}
}
何がやりたかったかというと、このタスタム投稿タイプに使うメディアへの直リンクを防ぎたかったのです
直リンクというと仰々しいですが、閲覧制限です。
そのサイトでのみ見ることができるというか、ログインユーザーのみというか。
upload_dirフックまでは良かったんですが、その後ハマって時間かかっちゃいましたが、ばっちりアップロード先を振り分けることができるようになりました。
upload_dirフックは、普通に管理画面から投稿する場合はまんまフックすれば投稿タイプ毎に振り分けられると思うんですが、今回はwp_insert_post経由だったので、時間かかっちゃいました
それにしても、Contact Form 7、ホントに懐が広いです!!
もう最高っす