Skip to main content More Related Content
PPT
PDF
KEY
ブログの枠を超える?ためのWordPressカスタマイズ入門 PDF
WordPressでオリジナルサイトを作るための最初の一歩的なカスタマイズテクニック PDF
脱コピペ!デザイナーにもわかるPHPとWP_Query PDF
WordPress初心者からの脱出! カスタムなんとかをちゃんと理解する KEY
エンジニアの為のWordPress入門 〜WordPressはWebAppプラットフォームです〜 KEY
Similar to 愛と涙のWordPress無理やりカスタマイズ事例集
PDF
PDF
【Wordpress】LightBox風jQueryを使ってポップアップ上でカスタムフィールドを出力。 KEY
PDF
KEY
KEY
PPTX
PPTX
PDF
PDF
PDF
PDF
WordPressのオススメスライドとか記事とか集めました。(2012.10.13 WordBench神戸) PPTX
20141119 Movable Type HandsOn Seminar PDF
PPTX
PDF
PDF
PDF
PDF
アプリケーションプラットホームとしてのWordPress PDF
More from Hidekazu Ishikawa
PDF
WordPressテーマ Lightning G3 PDF
人気テーマ(自称)には理由がある! Lightning Pro 便利機能 PDF
PDF
Lightning オンライン勉強会 #005 新バージョン解説簡易資料 PDF
初心者がつまずかないための、いちばんやさしい WordPress の用語解説 PDF
Gutenberg あれこれ in WordPress Meetup in 松本 Vol.14 PDF
超初心者のためのWordPressのサイトのデザインの微調整方法 PDF
PDF
WordCamp Haneda 2019 WordPress初心者のためのサイト運営虎の巻 #wchaneda PDF
簡単!自動バックアップ設定でWordPressを安心運用 PDF
WordPressで給与明細管理!BillVektor Salary を作った!(改訂版) PDF
WordPressで給与明細管理!BillVektor Salary を作った! PDF
いしかわの発表 Gifu WordPress Meetup 20181124 PDF
PDF
実録 情熱と苦悩のWordPressテーマ・プラグイン 販売ビジネス PDF
PDF
PDF
Lightning ✕ ExUnit の開発背景と設計思想 PDF
WordPress公式ディレクトリにテーマを登録しよう #wctokyo PDF
WordCampKansai 2015 公式ディレクトリへの テーマ掲載とビジネスモデル 愛と涙のWordPress無理やりカスタマイズ事例集
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
投稿を⾃動で追加する
$checkin_post = array();
//投稿タイプ
$checkin_post['post_type'] = 'checkin';
// 投稿の状態
$checkin_post['post_status'] = 'publish';
// 投稿のタイトル
$checkin_post['post_title'] = get_the_title($checkin_id);
// 投稿の作成者
$checkin_post['post_author'] = $user_id;
タイトルはチェックインした城の名前
$posted_id = wp_insert_post( $checkin_post );
新規投稿する関数 新規投稿する情報
投稿に成功した時に、成功した投稿のIDが返ってくる
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
最初の主な要望
• 多⾔語対応(英語 /⽇本語)
• 編集権限制御
部署毎の担当者が⾃部署のコンテンツだけ変更可能に
部署毎のコンテンツ : 固定ページと部署毎のニュース
• MicrosoftのActive Directoryとユーザーアカウントを連携
部署⽤のWordPressユーザーを発⾏して〜という運⽤ではない
• 閲覧制御
• イベントカレンダー
• 電話帳機能(CSVインポート・エクスポート)
• 他多数
- 31.
- 32.
- 33.
- 34.
Multi language switcherの⻑所と短所
• ⾔語毎のサイトの編集画⾯にログインして記事を書いて紐付け
• ⽇本語の翻訳が存在しないページでは英語を表⽰すれば良いという
場合でも⼿動で英語コンテンツを登録する必要がある。
⻑所
• シンプル(⼦サイトの記事同⼠を紐づけているだけ)
• このプラグインを停⽌しても⼤きな不具合は発⽣しない
(⾔語毎に別々の⼦サイトになるだけ)
• サイト(⾔語)毎に全然違うデザインやレイアウトにしやすい。
短所
- 35.
- 36.
- 37.
/ ̄ ̄\
/ノ( _ノ \
|⌒(( ●)(●)
.| (__人__) /⌒l
| ` ⌒´ノ |`'''|
/ ⌒ヽ } | | __________て
/ へ \ }__/ / | | ̄ ̄ ̄ ̄ ̄ ̄ ̄| | |(
/ / | ノ ノ | | \ / | | |’, ・
( _ ノ | \´ _ | | \ ノ( / | | | , ’
| \_,, -‐ ''"  ̄ ゙̄''―---└'´ ̄`ヽ | | | て
.| __ ノ _| | | (
ヽ _,, -‐ ''" ̄|_ ̄_o o o___|_|r'"
( ディレクションに関するセッションではないので詳細は割愛 )
- 38.
Multi language switcherを諦め独⾃実装
1画⾯で英語と⽇本語を⼊⼒する独⾃カスタマイズ...。
• 副⾔語(⽇本語)のタイトルと本⽂欄をカスタムフィールドで作成
• ⽇本語表⽰の場合はカスタムフィールドに保存されている情報を表⽰
• ⾔語の判別はURLにパラメーターをつける事で実施する
( 検索システム対策 )
基本的な構造案
- 39.
- 40.
- 41.
function change_url( $permalink){
// 差し替えたいURL
$permalink = 'https://www.google.co.jp';
// 戻す
return $permalink;
}
add_filter( 'the_permalink', 'change_url' );
the_permalink() タグを使ってある所のリンク先が
全部 google.co.jp になります。
フィルターフックの例
add_filter( 'the_permalink', 差し替える関数名 );
- 42.
function lang_switch_link_url( $permalink){
if ( !is_admin() ){
// 現在の⾔語を取得
$locale = get_locale();
// URLに⾔語パラメーターを追加
$permalink = add_query_arg( 'lang', $locale, $permalink );
}
return $permalink;
}
add_filter( 'the_permalink', 'lang_switch_link_url' ,10,2 );
※補⾜
• get_locale() で取得する現在の表⽰⾔語の値は別の箇所でフィルターで書き換え済みの想定
• 実際には外部リンクへの差し替えが⾏われている場合の処理、
及び the_permalink 以外で出⼒されるURLの書き換え処理なども必要になってきます。
フィルターでURLを置換
元のURL
パラメーター名 パラメーターの値
- 43.
タイトルや本⽂を差し替える
function lang_switch_title( $title){
if ( get_locale() == "ja" && !is_admin() ){
// ⽇本語表⽰で管理画⾯以外の場合に差し替え
$title = get_post_meta( $post->ID, 'lang_title_ja', true );
}
return $title;
}
add_filter( 'the_title', 'lang_switch_title', 10, 2 );
⽇本語のタイトルが保存された
カスタムフィールド
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
NEWS⽤投稿タイプを⽣成
function news_manage_add_post_type_news() {
//NEWS設定に投稿されている投稿データを取得
$news_settings = news_settings();
// NEWS設定の情報をループしてカスタム投稿タイプを作る
foreach ($news_settings as $key => $news_setting) {
$labels = array(
'name' => $news_setting->post_title,
'singular_name' => $news_setting->post_title,
'menu_name' => 'NEWS [ '.$news_setting->post_title.' ]',
);
$args = array(
'labels' => $labels,
// 中略
);
register_post_type( $news_setting->post_name.'_news', $args );
}
}
add_action( 'init', 'news_manage_add_post_type_news' );
- 51.
ポイント
• プラグイン ContactForm 7
• プラグイン Smart Custom Fields
• プラグイン VK All in one Expansion Unit の
カスタム投稿タイプマネージャー
カスタム投稿タイプを実際に表⽰するページ
情報ではなく、管理⽤の項⽬として使う
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
チェックボックスの⽣成
// NEWS設定に投稿されている情報を取得する関数
$news_settings =news_settings();
// NEWS投稿タイプをループしてチェックボックスを⽣成
echo '<ul>';
foreach ($news_settings as $key => $value) {
$news_post_type = $value->post_name;
$news_label = $value->post_title;
// チェックボックス出⼒
echo '<li><label><input type="checkbox"
name="edit_post_type_items[]" value="'.$news_post_type.ʼ”>'.
$value->post_title.'</label></li>';
}
echo '</ul>';
- 58.
参考
/*-------------------------------------------*/
/* 権限グループ編集画⾯ _投稿タイプ別の⼊⼒フィールドの⽣成
/*-------------------------------------------*/
add_action('user_group_setting_meta_box', 'eam_user_edit_post_type_items',9);
function eam_user_edit_post_type_items(){
global $post;
wp_nonce_field( wp_create_nonce(__FILE__), 'noncename__edit_post_type_items' );
// 現在保存されている編集可能投稿タイプの値を取得
$edit_post_type_items = get_post_meta( $post->ID, 'edit_post_type_items', true );
// NEWS投稿タイプの情報を取得
$args = array(
ʻpost_typeʼ => ʻnews_settingʼ, // NEWS設定の投稿タイプ
ʻposts_per_pageʼ => -1, // 投稿を全件取得
);
$news_settings = get_posts($args);
// NEWS投稿タイプをループしてチェックボックスを⽣成
if ( $news_settings ){
echo '<ul>';
foreach ($news_settings as $key => $value) {
$news_post_type = esc_attr( $value->post_name );
$news_label = esc_html( $value->post_title );
// 既にチェックが保存されているものはチェックをつける
$checked = '';
if ( $edit_post_type_items && in_array($value->post_name, $edit_post_type_items) ) {
$checked = " checked";
}
// チェックボックス出⼒
echo '<li><label><input type="checkbox" name="edit_post_type_items[]" value="'.$news_post_type.'"'.$checked.'>'.$news_label.'</label></li>';
} // foreach ($news_settings as $key => $value) {
echo '</ul>';
} // if ( $news_settings ){
}
- 59.
- 60.
- 61.
- 62.
ユーザー権限グループのロールを発⾏
function eam_update_role( $post_id){
// 変更のあったユーザー権限グループの投稿
$post = get_post( $post_id );
$role_slug = $post->post_name;
$role_label = $post->post_title;
// 変更のあったロールだけ⼀旦削除
remove_role( $role_slug );
// ロールを再度作成
add_role( $role_slug, $role_label, array('read'=> true) );
}
- 63.
- 64.
ユーザー権限グループに権限を設定
// 作成した各権限グループのロールを取得
$role =get_role( $role_slug );
// グループが編集可能に設定されている情報を取得
$edit_post_types = get_post_meta(・・・);
foreach ($edit_post_types as $key => $edit_post_type ) {
// チェックされている投稿タイプの権限を付与する
$role->add_cap( 'add_'.$edit_post_type' );
$role->add_cap( ʼedit_'.$edit_post_type' );
$role->add_cap( ʼdelete_'.$edit_post_type' );
(中略)
}
- 65.
- 66.
- 67.
- 68.
- 70.
/ ̄ ̄\
/ノ( _ノ \
|⌒(( ●)(●)
.| (__人__) /⌒l
| ` ⌒´ノ |`'''|
/ ⌒ヽ } | | __________て
/ へ \ }__/ / | | ̄ ̄ ̄ ̄ ̄ ̄ ̄| | |(
/ / | ノ ノ | | \ / | | |’, ・
( _ ノ | \´ _ | | \ ノ( / | | | , ’
| \_,, -‐ ''"  ̄ ゙̄''―---└'´ ̄`ヽ | | | て
.| __ ノ _| | | (
ヽ _,, -‐ ''" ̄|_ ̄_o o o___|_|r'"
( ディレクションに関するセッションではないので詳細は割愛 )
- 71.
- 72.
- 73.
- 74.
- 75.
公開権限の有無の処理
// 作成した各権限グループのロールを取得
$role =get_role( $role_slug );
// 公開可能かどうかの情報を取得
$publish_role = get_post_meta(・・・);
// 公開権限があるユーザー
if ( $publish_role ){
$role->add_cap( 'publish_'.$edit_post_type.'s' );
$role->add_cap( 'publish_others_'.$edit_post_type.'s' );
$role->add_cap( 'edit_published_'.$edit_post_type.'s' );
$role->add_cap( 'delete_others_'.$edit_post_type.'s' );
$role-
>add_cap( 'delete_published_'.$edit_post_type.'s' );
}
- 76.
- 77.
承認依頼メールの送信
// 承認依頼ボタン
<input type="submit"name="send_review_mail" value="承認依頼">
function edit_flow__send_review_mail(){
// 承認依頼のボタンが押されたら
if ( isset($_POST['send_review_mail']) ){
// メール送信処理を書く
}
}
add_action('save_post', 'edit_flow__send_review_mail');
- 78.
- 79.
- 80.
- 81.
公開済の記事の編集(複製2)
/*-------------------------------------------*/
/* 新規複製 _複製を実⾏
/*-------------------------------------------*/
function edit_flow__create_copy(){
// 管理画⾯のURLに複製識別⽤のURLが含まれていたら
if ( isset($_GET['master_id']) ){
$master_id = esc_html($_GET['master_id']);
// 記事の複製を実⾏
$copy_post_id = edit_flow__copy_post( $master_id );
// 複製した記事の編集画⾯へリダイレクト
$url = admin_url().'post.php?post='.$copy_post_id.'&action=edit';
header("Location: {$url}");
}
}
add_action('admin_init', 'edit_flow__create_copy');
- 82.
- 83.
- 84.
- 85.
- 87.
- 88.
- 89.
- 90.
- 91.
- 92.
- 93.
- 94.
- 95.