複数の著者のウェブサイトを運営しています。いくつかのタグが作成者によって選択されないように制限したいと考えています。
これまでに見つけた唯一のオプションは、フリー タグのテキスト フィールドをリスト (カテゴリ リストに似たもの) に置き換える手法でした。作成者が新しいタグを作成できるようにする必要があるため、これは私にとっては解決策ではありません。
特定のタグを非管理者から制限する方法があるに違いありません。どのようにするか知っていますか?ブレーンストーミングや適切な解決策は大歓迎です。
複数の著者のウェブサイトを運営しています。いくつかのタグが作成者によって選択されないように制限したいと考えています。
これまでに見つけた唯一のオプションは、フリー タグのテキスト フィールドをリスト (カテゴリ リストに似たもの) に置き換える手法でした。作成者が新しいタグを作成できるようにする必要があるため、これは私にとっては解決策ではありません。
特定のタグを非管理者から制限する方法があるに違いありません。どのようにするか知っていますか?ブレーンストーミングや適切な解決策は大歓迎です。
理想的な解決策はpost_tags_meta_box
、提案を ajax するときに使用される分類クエリを条件付きでフィルタリングすることであり、使用したくないタグを誰かが手動で入力しようとした場合にエラー処理を提供することでさえあると思いますが、私はそれをやってのけるのに役立つフィルターを認識していません。
Giordano の提案を拡張し、この他の質問を参照すると、functions.php でこのようなものを使用できます。
add_action('save_post', 'remove_tags_function', 10, 1); //whenever a post is saved, run the below function
function remove_tags_function( $post_id ){
if(!current_user_can('manage_options')){ // if the logged in user cannot manage options (only admin can)
$post_tags = wp_get_post_terms( $post_id, 'post_tag', array( 'fields'=>'names' ) ); //grab all assigned post tags
$pos = array_search( 'tag-to-be-deleted', $post_tags ); //check for the prohibited tag
if( false !== $pos ) { //if found
unset( $post_tags[$pos] ); //unset the tag
wp_set_post_terms ($post_id, $post_tags, 'post_tag'); //override the posts tags with all prior tags, excluding the tag we just unset
}
}//end if. If the current user CAN manage options, the above lines will be skipped, and the tag will remain
}
管理者以外のユーザーは引き続き入力して追加できますがtag-to-be-deleted
、投稿には固執しません。保存すると、タグは削除されます。ユーザーが本当に献身的である場合、スペルを変えたり、ご覧のように大文字を変更したりできますが、技術的には同じタグにはなりません。必要なテーマの目的のために純粋に保つことができます。 . 管理者機能を持たないユーザーが禁止タグを追加できる状況は想像できませんが、絶対にないと言うよりはましです。
管理者以外の特定のユーザーが禁止タグを投稿に割り当てられるようにする場合は、4 行目に渡されるパラメーターを修正する必要がありますif(!current_user_can('...'){
。この条件ステートメントに渡すことができるその他の機能については、Wordpress のドキュメントの Roles & Capabilities を確認してください。ロールよりも機能を確認する方がはるかに簡単なので、タグの削除を免除したいユーザーのレベルに制限されている論理機能を選択してください。
作成者があなたでない場合は、保存時に指定されたタグを投稿から削除する簡単なプラグインを作成できます。投稿が保存されたときに関数を呼び出すことができますadd_action('save_post', 'remove_tags_function',10,2);
次に、次のような関数を作成します
function remove_tags_function($postID, $post){
if($parent_id = wp_is_post_revision($postID))
{
$postID = $parent_id;
$post = get_post($postID);
}
if($post->post_author != 'YOUR AUTHOR NUMBER'){
$tags = wp_get_post_tags( $post_id );
$i = 0;
foreach($tags as $tag){
if(in_array("TAG NAME", $tag)) unset $tags[$i];
$i++;
}
}}
私はそれをテストしていませんが、論理的には動作します。
編集:
それはうまくいきません!
プラグインフォルダの.phpファイルに次のものを入れてみてください。今のところテストされていませんが、問題ないようです。
<?php
add_action('save_post', 'remove_tags_function',10,2);
function remove_tags_function($postID, $post){
if($parent_id = wp_is_post_revision($postID))
{
$postID = $parent_id;
$post = get_post($postID);
}
$user_info = $user_info = get_userdata($post->post_author);
if($user_info->user_level != 10){ // 10 = admin
untag_post($postID, array('TAGS', ... ));
}}
function untag_post($post_ids, $tags) {
global $wpdb;
if(! is_array($post_ids) ) {
$post_ids = array($post_ids);
}
if(! is_array($tags) ) {
$tags = array($tags);
}
foreach($post_ids as $post_id) {
$terms = wp_get_object_terms($post_id, 'post_tag');
$newterms = array();
foreach($terms as $term) {
if ( !in_array($term->name,$tags) ) { //$term will be a wordpress Term object.
$newterms[] = $term;
}
}
wp_set_object_terms($post_id, $newterms, 'post_tag', FALSE);
}
} // I got this from http://wordpress.stackexchange.com/questions/49248/remove-tags-from-posts-in-php/49256#49256
?>