まだ登録されていないゲストのコメントに、1つの投稿のみをコメントすることを許可します。他の投稿は、登録ユーザーのためだけにコメント可能でなければなりません。
それは便利な機能のように聞こえます。必要なものを入手するには、3つのことを変更する必要があります。
投稿エディタページで画面オプションを開くと、ディスカッションメタボックスを有効にできます。そのメタボックスにチェックボックスを追加します。
ラッキーです、'post_comment_status_meta_box-options'
というフックがあります。それを使ってみましょう:
add_action( 'post_comment_status_meta_box-options', 'acpp_checkbox' );
/**
* Print a checkbox into the comment status metabox.
*
* @wp-hook post_comment_status_meta_box-options
* @param object $post
* @return void
*/
function acpp_checkbox( $post )
{
$key = '_allow_anonymous_comments';
$current = get_post_meta( $post->ID, $key, TRUE );
printf(
'<br /><label for="%1$s">
<input type="checkbox" id="%1$s" name="%1$s" class="selectit" %2$s/> %3$s
</label>',
$key,
checked( 1, $current, FALSE ),
apply_filters( 'acpp_metabox_label', 'Allow anonymous comments.' )
);
}
ご覧のとおり、私は新しい投稿メタキー'_allow_anonymous_comments'
を発明しました。先頭のアンダースコアは、カスタムフィールドメタボックスからそれを隠します。 (関連: ドロップダウンリストからカスタムフィールド「提案」を削除する方法 )
メタ値がすでに存在する場合、それが1
と等しい場合はwe preselect it。
テーマの作者がその値を翻訳できるようにするために、フィルタ'acpp_metabox_label'
が存在します。 1つの小さな文字列の言語ファイルを追加するのが面倒すぎました…
値を保存するには、'save_post'
にフックし、いくつかのチェックを実行して結果を整数として格納します。
add_action( 'save_post', 'acpp_save' );
/**
* Save the checkbox value as number
*
* @wp-hook save_post
* @param int $post_id
* @param object $post
* @return void
*/
function acpp_save( $post_id, $post )
{
// AJAX autosave
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
return;
// Some other POST request
if ( ! isset ( $_POST['post_type'] ) )
return;
// Missing capability
if ( ! current_user_can( 'edit_' . $_POST['post_type'], $post_id ) )
return;
$key = '_allow_anonymous_comments';
// Checkbox successfully clicked
if ( isset ( $_POST[ $key ] ) and 'on' === strtolower( $_POST[ $key ] ) )
return update_post_meta( $post_id, $key, 1 );
// Checkbox deselected
delete_post_meta( $post_id, $key );
}
そして今度はフロントエンドでその値を使い、オプションcomment_registration
のチェックのために結果を変更しなければなりません。 wp-admin
でブログ全体の値を変更したくないです。
そのため、そのフィルタにis_admin()
のチェックを追加しました。オプションチェックのフィルタリングは実際には簡単です。'pre_option_' . $option_name
にフックし、FALSE
以外の値を返します。 TRUE
も返したくないので、そのチェックを0
を返すことで行います。
add_filter( 'pre_option_comment_registration', 'acpp_comment_reg_filter' );
/**
* Trick the registration checks on front-end
*
* Important: If we return FALSE, the filter will be effectively ignored.
* It has to be any other value.
*
* @wp-hook pre_option_comment_registration
* @return bool|int
*/
function acpp_comment_reg_filter()
{
if ( is_admin() )
return FALSE;
$key = '_allow_anonymous_comments';
$post_id = 0;
// Only available on wp-comments-post.php, not on regular post pages.
if ( isset( $_POST['comment_post_ID'] ) )
$post_id = (int) $_POST['comment_post_ID'];
//
$post = get_post( $post_id );
$open = get_post_meta( $post->ID, $key, TRUE );
if ( 1 == $open )
return 0;
return FALSE;
}
このチェックは、コメントフォーム、スレッド化されたコメントへのコメント返信リンク、およびコメントがwp-comments-post.php
に保存されるときにWordPressによって使用されます。
それで全部です。 GitHubからプラグインとしてコードをダウンロードできます。
プラグイン投稿ごとの匿名コメント