Skip to content
wiki.fftac.org

Membership - Source Excerpt 01

Back to Membership

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);