Membership - Source Excerpt 01
Summary
This source excerpt preserves a bounded section of Anti-Christ.org/wp-content/plugins/fftac-membership/inc/membership.php so readers can inspect the evidence without opening the full source file.
**Source path:** Anti-Christ.org/wp-content/plugins/fftac-membership/inc/membership.php
<?php
/**
* Front-end membership portal helpers and handlers.
*
* @package Antichrist_Engine
*/
if (!defined('ABSPATH')) {
exit;
}
/**
* Membership page definitions.
*
* @return array<string, array<string, string>>
*/
function antichrist_engine_membership_page_definitions()
{
return array(
'portal' => array(
'title' => __('Membership Portal', 'antichrist-engine'),
'slug' => 'membership',
'template' => 'template-membership-portal.php',
'content' => __('Create an account, sign in, or recover access from this page. The design and workflows are managed by the theme.', 'antichrist-engine'),
),
'members' => array(
'title' => __('Members Area', 'antichrist-engine'),
'slug' => 'members-area',
'template' => 'template-members-area.php',
'content' => __('This page is protected for signed-in members. Edit this page in WordPress to add the private content, downloads, links, or announcements you want members to see after login.', 'antichrist-engine'),
),
);
}
/**
* Creates the membership pages if they do not exist yet.
*
* @return void
*/
function antichrist_engine_membership_ensure_pages()
{
if (wp_installing() || !post_type_exists('page')) {
return;
}
$version = '1.0.0';
$needs_refresh = get_option('antichrist_engine_membership_pages_version') !== $version;
if (!$needs_refresh) {
foreach (antichrist_engine_membership_page_definitions() as $key => $page_definition) {
$stored_id = absint(get_option('antichrist_engine_membership_' . $key . '_page_id'));
if (
!$stored_id ||
'trash' === get_post_status($stored_id) ||
get_page_template_slug($stored_id) !== $page_definition['template']
) {
$needs_refresh = true;
break;
}
}
}
if (!$needs_refresh) {
return;
}
foreach (antichrist_engine_membership_page_definitions() as $key => $page_definition) {
$option_name = 'antichrist_engine_membership_' . $key . '_page_id';
$stored_id = absint(get_option($option_name));
$page_id = 0;
if ($stored_id && 'trash' !== get_post_status($stored_id)) {
$page_id = $stored_id;
} else {
$existing_page = get_page_by_path($page_definition['slug'], OBJECT, 'page');
if ($existing_page instanceof WP_Post && 'trash' !== $existing_page->post_status) {
$page_id = (int) $existing_page->ID;
}
}
if (!$page_id) {
$page_id = wp_insert_post(array(
'post_type' => 'page',
'post_status' => 'publish',
'post_title' => $page_definition['title'],
'post_name' => $page_definition['slug'],
'post_content' => $page_definition['content'],
), true);
if (is_wp_error($page_id)) {
continue;
}
}
update_post_meta($page_id, '_wp_page_template', $page_definition['template']);
update_option($option_name, (int) $page_id);
}
update_option('antichrist_engine_membership_pages_version', $version);
}
add_action('init', 'antichrist_engine_membership_ensure_pages', 20);
/**
* Registers the Membership admin settings page.
*
* @return void
*/
function antichrist_engine_membership_register_settings_page()
{
add_options_page(
__('FFTAC Membership', 'antichrist-engine'),
__('FFTAC Membership', 'antichrist-engine'),
'manage_options',
'fftac-membership',
'antichrist_engine_membership_render_settings_page'
);
}
add_action('admin_menu', 'antichrist_engine_membership_register_settings_page');
/**
* Registers Membership-owned settings.
*
* @return void
*/
function antichrist_engine_membership_register_settings()
{
register_setting('antichrist_engine_membership', 'antichrist_engine_membership_portal_page_id', array(
'type' => 'integer',
'sanitize_callback' => 'antichrist_engine_membership_sanitize_page_id_option',
'default' => 0,
));
register_setting('antichrist_engine_membership', 'antichrist_engine_membership_members_page_id', array(
'type' => 'integer',
'sanitize_callback' => 'antichrist_engine_membership_sanitize_page_id_option',
'default' => 0,
));
add_settings_section(
'antichrist_engine_membership_pages_section',
__('Membership pages', 'antichrist-engine'),
'antichrist_engine_membership_render_pages_section',
'fftac-membership'
);
add_settings_field(
'antichrist_engine_membership_portal_page_id',
__('Membership portal page', 'antichrist-engine'),
'antichrist_engine_membership_render_page_setting',
'fftac-membership',
'antichrist_engine_membership_pages_section',
array(
'label_for' => 'antichrist_engine_membership_portal_page_id',
'page_key' => 'portal',
)
);
add_settings_field(
'antichrist_engine_membership_members_page_id',
__('Members area page', 'antichrist-engine'),
'antichrist_engine_membership_render_page_setting',
'fftac-membership',
'antichrist_engine_membership_pages_section',
array(
'label_for' => 'antichrist_engine_membership_members_page_id',
'page_key' => 'members',
)
);
}
add_action('admin_init', 'antichrist_engine_membership_register_settings');
/**
* Sanitizes a configured membership page ID.
*
* @param mixed $page_id Submitted page ID.
* @return int
*/
function antichrist_engine_membership_sanitize_page_id_option($page_id)
{
return absint($page_id);
}
/**
* Renders the Membership settings page.
*
* @return void
*/
function antichrist_engine_membership_render_settings_page()
{
if (!current_user_can('manage_options')) {
return;
}
echo '<div class="wrap">';
echo '<h1>' . esc_html__('FFTAC Membership', 'antichrist-engine') . '</h1>';
echo '<p>' . esc_html__('Choose the WordPress pages used by the front-end membership portal and protected members area. The plugin will keep the selected pages on the correct templates.', 'antichrist-engine') . '</p>';
settings_errors();
echo '<form method="post" action="options.php">';
settings_fields('antichrist_engine_membership');
do_settings_sections('fftac-membership');
submit_button(__('Save Membership settings', 'antichrist-engine'));
echo '</form>';
echo '</div>';
}
/**
* Renders the Membership pages settings section.
*
* @return void
*/
function antichrist_engine_membership_render_pages_section()
{
echo '<p>' . esc_html__('The default pages are provisioned automatically, but these selectors let an administrator point the membership system at replacement pages when needed.', 'antichrist-engine') . '</p>';
}
/**
* Renders a membership page selector.
*
* @param array<string, string> $args Field arguments.
* @return void
*/
function antichrist_engine_membership_render_page_setting($args)
{
$page_key = sanitize_key((string) ($args['page_key'] ?? ''));
$field_id = (string) ($args['label_for'] ?? '');
$selected = antichrist_engine_membership_get_page_id($page_key);
if (function_exists('wp_dropdown_pages')) {
wp_dropdown_pages(array(
'name' => $field_id,
'id' => $field_id,
'selected' => $selected,
'show_option_none' => __('Select a page', 'antichrist-engine'),
'option_none_value' => 0,
));
} else {
echo '<input id="' . esc_attr($field_id) . '" name="' . esc_attr($field_id) . '" type="number" min="0" value="' . esc_attr((string) $selected) . '">';
}
echo '<p class="description">' . esc_html__('Changing this will update the route used by membership redirects and access control.', 'antichrist-engine') . '</p>';
}
/**
* Gets a configured membership page id.
*
* @param string $page_key Page definition key.
* @return int
*/
function antichrist_engine_membership_get_page_id($page_key)
{
return absint(get_option('antichrist_engine_membership_' . $page_key . '_page_id'));
}
/**
* Gets a configured membership page URL.
*
* @param string $page_key Page definition key.
* @return string
*/
function antichrist_engine_membership_get_page_url($page_key)
{
$page_id = antichrist_engine_membership_get_page_id($page_key);