2026年11月10日

2026年11月10日

Restrict Content Proのエラーを解決する方法

はじめに

Restrict Content Proで有料会員限定に設定したコンテンツが非会員でも閲覧できてしまう・Stripeでの決済が「Payment processing failed」エラーで失敗する・メンバーシップレベルを変更しても古いレベルのコンテンツ制限が残ってしまう・トライアル期間終了後にアカウントが自動で無効化されないといった問題は、プラグインの設定・決済設定・フックの競合が原因です。

症状・原因

  • 「メンバーのみ」に設定したページが非ログインユーザーからも閲覧できる
  • StripeのAPIキーを設定して決済しようとすると「Your card was declined」ではなく内部エラーが出る
  • 管理画面でユーザーのレベルを「Silver」から「Gold」に変更したがコンテンツ制限が更新されない
  • 無料トライアル期間が終わっても会員ステータスが「Active」のままで課金されない

解決手順

ステップ1:Restrict Content Proの状態を確認する

# Restrict Content Proの設定確認
wp eval "
if (defined('RCP_PLUGIN_VERSION')) {
    echo 'RCP version: ' . RCP_PLUGIN_VERSION . PHP_EOL;
}

// メンバーシップレベルを確認
\$levels = rcp_get_membership_levels();
echo 'Membership levels: ' . count(\$levels) . PHP_EOL;

foreach (\$levels as \$level) {
    printf('  #%d: %s | Price: %s | Duration: %s %s | Trial: %s days' . PHP_EOL,
        \$level->id,
        \$level->name,
        \$level->price,
        \$level->duration,
        \$level->duration_unit,
        \$level->trial_duration ?? 0
    );
}

// アクティブな会員を確認
global \$wpdb;
\$active_members = \$wpdb->get_var(
    \"SELECT COUNT(*) FROM {\$wpdb->prefix}rcp_memberships WHERE status = 'active'\"
);
echo 'Active members: ' . \$active_members . PHP_EOL;

// 支払いゲートウェイ設定
\$rcp_options = get_option('rcp_settings', []);
echo 'Gateway: '   . (\$rcp_options['gateway'] ?? 'not set') . PHP_EOL;
echo 'Test mode: ' . ((\$rcp_options['sandbox'] ?? false) ? 'yes' : 'no') . PHP_EOL;
"

ステップ2:コンテンツアクセス制限をカスタマイズする

// functions.php: RCPアクセス制限

// ① メンバーのアクセス可否をカスタマイズ
add_filter('rcp_member_can_access', function(bool $can_access, int $user_id, int $post_id): bool {
    // 管理者は常にアクセス可能
    if (user_can($user_id, 'manage_options')) {
        return true;
    }

    // 投稿タイプによる追加制限
    $post_type = get_post_type($post_id);
    if ($post_type === 'premium_content') {
        $membership = rcp_get_customer_membership_by_user_id($user_id);
        if (!$membership || $membership->get_status() !== 'active') {
            return false;
        }
        // Goldレベル以上のみアクセス可能
        $level_id = $membership->get_object_id();
        $level    = rcp_get_membership_level($level_id);
        if ($level && (float) $level->price < 2000) {
            return false;
        }
    }

    return $can_access;
}, 10, 3);

// ② アクセス拒否時のリダイレクト先をカスタマイズ
add_filter('rcp_no_access_redirect', function(string $redirect_url, int $post_id): string {
    if (!is_user_logged_in()) {
        return wp_login_url(get_permalink($post_id));
    }
    // ログイン済みだが権限なし → アップグレードページへ
    return home_url('/membership-upgrade/');
}, 10, 2);

// ③ アクセス拒否メッセージをカスタマイズ
add_filter('rcp_restricted_content_message', function(string $message): string {
    return sprintf(
        '<div class="rcp-restricted"><p>このコンテンツは会員限定です。</p><a href="%s" class="rcp-btn">今すぐ登録</a></div>',
        esc_url(rcp_get_registration_page_url())
    );
});

ステップ3:メンバーシップ処理をカスタマイズする

// functions.php: メンバーシップ管理

// ① メンバーシップ有効化時の処理
add_action('rcp_membership_post_activate', function(RCP_Membership $membership): void {
    $user_id = $membership->get_customer()->get_user_id();
    $level   = rcp_get_membership_level($membership->get_object_id());

    // レベルに応じてWPロールを付与
    $wp_user = new WP_User($user_id);
    if ($level && (float) $level->price >= 2000) {
        $wp_user->add_role('premium_member');
    } else {
        $wp_user->add_role('basic_member');
    }

    update_user_meta($user_id, '_rcp_activated_at', current_time('mysql'));
    error_log(sprintf('[RCP] Membership activated for user #%d, level: %s', $user_id, $level->name ?? ''));
});

// ② メンバーシップ期限切れ時の処理
add_action('rcp_membership_post_expire', function(RCP_Membership $membership): void {
    $user_id = $membership->get_customer()->get_user_id();

    // 会員ロールを削除
    $wp_user = new WP_User($user_id);
    $wp_user->remove_role('premium_member');
    $wp_user->remove_role('basic_member');

    update_user_meta($user_id, '_rcp_expired_at', current_time('mysql'));
    error_log(sprintf('[RCP] Membership expired for user #%d', $user_id));
});

// ③ 会員更新リマインダー(期限7日前)
add_action('rcp_membership_expiring_soon', function(RCP_Membership $membership): void {
    $customer = $membership->get_customer();
    $user     = get_userdata($customer->get_user_id());
    if (!$user) return;

    wp_mail(
        $user->user_email,
        sprintf('[%s] 会員期限まであと7日です', get_bloginfo('name')),
        sprintf("こんにちは %s さん、\n\n会員期限まであと7日です。\n\n更新はこちら: %s",
            $user->display_name,
            rcp_get_registration_page_url()
        )
    );
});

ステップ4:支払い処理をデバッグする

# 支払いログの確認
wp eval "
// RCPの支払い履歴を確認
global \$wpdb;
\$payments = \$wpdb->get_results(
    \"SELECT id, customer_id, amount, status, gateway, date
     FROM {\$wpdb->prefix}rcp_payments
     ORDER BY date DESC LIMIT 10\",
    ARRAY_A
);

echo 'Recent payments: ' . count(\$payments) . PHP_EOL;
foreach (\$payments as \$payment) {
    printf('  #%d: customer=%d | %s | %s | %s | %s' . PHP_EOL,
        \$payment['id'],
        \$payment['customer_id'],
        \$payment['amount'],
        \$payment['status'],
        \$payment['gateway'],
        \$payment['date']
    );
}

// 失敗した支払いを確認
\$failed = \$wpdb->get_var(
    \"SELECT COUNT(*) FROM {\$wpdb->prefix}rcp_payments WHERE status = 'failed'\"
);
echo 'Failed payments: ' . \$failed . PHP_EOL;

// Stripeキー確認
\$settings = get_option('rcp_settings', []);
\$live_key  = \$settings['stripe_live_secret_key'] ?? '';
\$test_key  = \$settings['stripe_test_secret_key'] ?? '';
echo 'Live key set: '  . (!empty(\$live_key) ? 'yes (sk_live_...)' : 'NO') . PHP_EOL;
echo 'Test key set: '  . (!empty(\$test_key) ? 'yes (sk_test_...)' : 'NO') . PHP_EOL;
"

ステップ5:登録フォームをカスタマイズする

// functions.php: 登録フォームカスタマイズ

// ① 登録完了後にカスタム処理
add_action('rcp_form_processing', function(array $posted, int $user_id, float $price): void {
    // 登録時に追加情報をメタに保存
    if (!empty($posted['company_name'])) {
        update_user_meta($user_id, 'company_name', sanitize_text_field($posted['company_name']));
    }

    error_log(sprintf('[RCP] Registration processed: user_id=%d, price=%s', $user_id, $price));
}, 10, 3);

// ② カスタムフィールドを登録フォームに追加
add_action('rcp_before_subscription_form_fields', function(): void {
    ?>
    <p id="rcp_company_name_wrap">
        <label for="rcp_company_name">会社名(任意)</label>
        <input name="company_name" id="rcp_company_name" type="text"
               value="<?php echo esc_attr($_POST['company_name'] ?? ''); ?>"/>
    </p>
    <?php
});

// ③ 無料メンバーシップの自動登録
add_action('user_register', function(int $user_id): void {
    $free_level_id = 1; // 無料レベルのID
    $free_level    = rcp_get_membership_level($free_level_id);
    if (!$free_level || (float) $free_level->price > 0) return;

    rcp_add_user_to_membership_level($user_id, $free_level_id);
    error_log(sprintf('[RCP] Auto-assigned free membership to user #%d', $user_id));
});

注意事項

  • Restrict Content Proのコンテンツ制限が機能しない場合、パーマリンク設定が原因のことがあります。「設定 → パーマリンク」を開いて「変更を保存」を一度クリックするだけで解決することがあります
  • Stripeでの決済が失敗する場合はWebhookの設定を確認してください。StripeダッシュボードのWebhookエンドポイントがhttps://example.com/?rcp-listener=stripeの形式で設定されていないと決済完了通知が届きません
  • Restrict Content ProとWooCommerceを同時に使用している場合、WooCommerceのセッション管理とRCPのセッション管理が競合することがあります。rcp_settingsの「セッション設定」を確認し競合を解消してください

まとめ

Restrict Content Pro修復は①rcp_get_membership_levels()でレベル設定・rcp_membershipsテーブルでアクティブ会員数・ゲートウェイ設定を確認、②rcp_member_can_accessフィルターで管理者除外・プレミアムコンテンツの価格ベース制限・rcp_no_access_redirectでリダイレクト先設定、③rcp_membership_post_activateフックでWPロール付与・rcp_membership_post_expireでロール削除・rcp_membership_expiring_soonで更新リマインダー、④rcp_paymentsテーブルで支払い履歴・失敗件数・Stripeキーを確認、⑤rcp_form_processingで登録データ保存・カスタムフィールド追加・無料メンバーシップの自動付与する手順で解決します。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲