web-dev-qa-db-ja.com

単一の投稿に対するゲストのコメントを許可する

まだ登録されていないゲストのコメントに、1つの投稿のみをコメントすることを許可します。他の投稿は、登録ユーザーのためだけにコメント可能でなければなりません。

3
Amaca

それは便利な機能のように聞こえます。必要なものを入手するには、3つのことを変更する必要があります。

  1. 投稿ごとに匿名コメントを有効にするチェックボックスを追加します。
  2. チェックボックスの値を投稿と一緒に保存します。
  3. 投稿ビューでコメント登録要件のチェックをフィルタリングしてコメントフォームを有効にし、実際のコメント保存アクションでチェックを通過させます。

チェックボックス

投稿エディタページで画面オプションを開くと、ディスカッションメタボックスを有効にできます。そのメタボックスにチェックボックスを追加します。

enter image description here

ラッキーです、'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でブログ全体の値を変更したくないです。

enter image description here

そのため、そのフィルタに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からプラグインとしてコードをダウンロードできます。
プラグイン投稿ごとの匿名コメント

3
fuxia