タイトルの通り。
pTypeConverterで通常の投稿(カテゴリ名"hoge"とする)をカスタム投稿に変換しても、カテゴリ情報は削除されない。
そのため、その後条件分岐でin_category("hoge")などで振り分けようとしても通常の投稿と一緒に、変更したカスタム投稿が引っかかってしまう。
そりゃそうっちゃそうなんだけど、古いWPでカテゴリ分けで作っていたものを、カスタム投稿に振り分けたいなんて案件はざらにある。
で、カスタム投稿にした投稿からカテゴリ情報を除去する為には、そのカスタム投稿に"categeory"というカスタムタクソノミを作ってやればいい。
register_post_type( 'hoge',
array(
'labels' => array(
'name' => __( 'カスタム投稿名' ),
'singular_name' => __( 'カスタム投稿名' )
),
'public' => true,
'has_archive' => true,
'menu_position' => 5,
'supports'=> array('title', 'thumbnail', 'excerpt', 'editor') ,
)
);
register_taxonomy(
'category',
'column',
array(
'hierarchical' => true,
'update_count_callback' => '_update_post_term_count',
'label' => 'カテゴリー',
'singular_label' => 'カテゴリー',
'public' => true,
'show_ui' => true,
'query_var' => true
)
);
こんな感じでカスタム投稿名に「カテゴリ」というカスタムタクソノミを追加してやると、通常の投稿(post)と同じカテゴリーが表示される。
ここでカテゴリ情報を除去すると、MySQL内のカテゴリとの関連性を示す「wp_term_relationships」が除去される。
カテゴリーもカスタムタクソノミの一種ってことですね。
流石Wordpress。
とある案件で、管理画面からカスタム投稿記事を投稿する際に、カスタムタクソノミ(カスタム分類)にチェックが入って無ければアラートを出す、という機能が欲しくなった。
クライアントが投稿する時にチェックを忘れると、通常の投稿は自動的に一番上のカテゴリにチェックが入り、カスタム投稿の場合は、カスタムタクソノミが空白で投稿される。
投稿ミスで自動的にチェックを入れられると困る場合、空白だとサイト表示で困る場合が多いので、
これを防ぎたくて「管理画面のカスタム分類投稿ページ」を分岐させる方法を探して四苦八苦していたが結局なんともならず、フォーラムに投稿。
すると投稿当日にはもう解決案が投稿されてた。
有難うオープンソース、最高だwordpress。
https://gist.github.com/gatespace/11020994
回答者の方はgithubにUPしてくれてたけど、一応自サイトにもメモ。
/*
* WordPressの投稿作成画面で必須項目を作る(空欄ならJavaScriptのアラート)
*/
add_action( 'admin_head-post-new.php', 'mytheme_post_edit_required' ); // 新規投稿画面でフック
add_action( 'admin_head-post.php', 'mytheme_post_edit_required' ); // 投稿編集画面でフック
function mytheme_post_edit_required() {
?>
<script type="text/javascript">
jQuery(document).ready(function($){
if( 'post' == $('#post_type').val() || 'page' == $('#post_type').val() ){ // post_type 判定。例は投稿と固定ページ。カスタム投稿タイプは適宜追加
$("#post").submit(function(e){ // 更新あるいは下書き保存を押したとき
if('' == $('#title').val()) { // タイトル欄の場合
alert('タイトルを入力してください!');
$('.spinner').hide(); // spinnerアイコンを隠す
$('#publish').removeClass('button-primary-disabled'); // #publishからクラス削除
$('#title').focus(); // 入力欄にフォーカス
return false;
}
if($("#taxonomy-category input:checked").length < 1 ) { // カテゴリーがチェックされているかどうか。条件を要確認。普通は設定したカテゴリーになるから要らない
alert('カテゴリーを選択してください');
$('.spinner').hide();
$('#publish').removeClass('button-primary-disabled');
$('#taxonomy-category').focus();
return false;
}
if( $("#set-post-thumbnail img").length < 1 ) { // アイキャッチ画像
alert('アイキャッチ画像を設定してください!');
$('.spinner').hide();
$('#publish').removeClass('button-primary-disabled');
$('#set-post-thumbnail').focus();
return false;
}
});
}
});
</script>
<?php
}
という事。
実際にはカスタム投稿の場合は、2か所ある#taxonomy-category となっている部分を #taxonomy-tax名 に変更して使用する。
これで投稿時カテゴリー(or カスタムタクソノミ)にチェックが入って無ければアラートが出て、チェックを入れないと投稿できなくなる。
殴り書きで文章変だけれども、自分用メモという事で。
・やりたいこと
WordPressは、記事投稿時に「タイトルと本文が両方空白」の場合は編集が反映されない。
カスタムフィールドのみの記事などを投稿するために、特定の投稿タイプでタイトルが空白の時は自動的にタイトルを挿入して投稿されるようにする。
functions.phpに以下を記載。
function replace_post_title($title) {
global $post;
//post_typeを判定(post, page, カスタム投稿)
if( $post->post_type == '投稿タイプ' ){
if($title === ""){
$title .= '自動投稿するタイトル名';
}
}
return $title;
}
add_filter('title_save_pre', 'replace_post_title');
上記で、タイトルを空白で投稿した場合、自動的にタイトル名が挿入される。
引用元サイト com4tis様
引用元では自動的にカスタムフィールドを入力するようになっているが、そこまでは必要なかったため、簡単に。
あるプラグインの設定項目を変更して保存すると403エラーが出て、設定変更を反映できないことがあった。
僕が使ってたのはwp polesとfancybox for wordpressなんだけど、そのどっちもが同じ挙動で慌てた。
最初は「管理画面でできなければ直接書き換えればいいじゃない!」とマリーアントワネットばりに強引にmysqlを直接書き換えてたんだけど、403が出る原因がレンタルサーバーの「WAF」にある事が分かった。
hetemlやロリポップが導入してるサーバーサイドのセキリュティソフトウェア
「WAF(ウェブアプリケーションファイアウォール)」
はデフォルトで有効になってるが、これがたまに誤検知する。
以前ロリポップで共用サーバのDB経由で大量ハッキングを受けたときも「WAFを有効にしてね!」とロリポップさんからお達しがきたが、実際WAFを有効にしてる事でwordpress運用時にトラブルが出るケースが多い。
だからといって面倒だからWAFをオフにする、ってのもアレ。
なのでこちらに書いてあるWAFをONにしたままwordpressを運用する方法などはいかがかと。
あーなるほどね、レンタルサーバが出してる共用SSLのURLにだけWAFをオフにして、htaccessで認証をかけて、管理画面はそこからログインする。
それでサイト自体のSQLインジェクションを防ぐってことね。
さらにXSS(クロスサイトスクリプティング)を防ぐために、更新作業は普段のブラウザと違うブラウザを使えとのこと。
うわー手間!
でも安全ってこうまでしないと手に入らないってことですね。
僕は面倒なので、403が出たときだけWAFを切ります。
2.7くらいからアップデートして使っているwordpressの管理画面でタイムゾーンの設定を「'UTC+9'」(日本時間)にしているのに、タイムゾーンがUTC(グリニッジ標準時)のまま。query_postsで投稿を直接日時指定しても上手く反映されない困った。
↓
wordpressのフォルダ直下「wp-settings.php」が
// WordPress calculates offsets from UTC. date_default_timezone_set( 'UTC' );
と、UTCのままになっていることがある。
これを
// WordPress calculates offsets from UTC. date_default_timezone_set( 'UTC+9' );
にすることで、日本時間になる・・・のだが!
wp-settings.phpはコアファイルなので勿論アップデート時には上書きされてしまう。
なので上記方法はNG。
hetemlなどのtimezoneを変更できない&UTCのレンタルサーバーは、date関数をwordpress内で用意された
「date_i18n」
という関数に置き換える事で解決できる。