Skip to content
wiki.fftac.org

Content Types - Source Excerpt 01

Back to Content Types

Summary

This source excerpt preserves a bounded section of 2IA.org/wp-content/themes/twoia-intelligence/inc/content-types.php so readers can inspect the evidence without opening the full source file.

**Source path:** 2IA.org/wp-content/themes/twoia-intelligence/inc/content-types.php

<?php
/**
 * Site-specific editorial content types.
 *
 * @package TwoIA
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Return editorial content type definitions.
 *
 * @return array
 */
function twoia_editorial_content_types() {
	return array(
		'twoia_issue_hub'       => array(
			'singular'    => __( 'Issue Hub', 'two-identities-anonymous' ),
			'plural'      => __( 'Issue Hubs', 'two-identities-anonymous' ),
			'menu_name'   => __( 'Issue Hubs', 'two-identities-anonymous' ),
			'description' => __( 'Evergreen civil-liberties issue hubs for surveillance, identity, public records, AI, metadata, and accountability.', 'two-identities-anonymous' ),
			'slug'        => 'issue-hubs',
			'landing'     => 'surveillance-systems',
			'menu_icon'   => 'dashicons-networking',
		),
		'twoia_investigation'   => array(
			'singular'    => __( 'Investigation', 'two-identities-anonymous' ),
			'plural'      => __( 'Investigations', 'two-identities-anonymous' ),
			'menu_name'   => __( 'Investigations', 'two-identities-anonymous' ),
			'description' => __( 'Evidence-led investigations with source notes, confidence labels, right of reply, and correction handling.', 'two-identities-anonymous' ),
			'slug'        => 'investigations',
			'landing'     => 'open-source-intelligence',
			'menu_icon'   => 'dashicons-search',
		),
		'twoia_policy'          => array(
			'singular'    => __( 'Policy Analysis', 'two-identities-anonymous' ),
			'plural'      => __( 'Policy Analyses', 'two-identities-anonymous' ),
			'menu_name'   => __( 'Policy Analyses', 'two-identities-anonymous' ),
			'description' => __( 'Analysis of laws, rules, procurement, vendor claims, and oversight systems.', 'two-identities-anonymous' ),
			'slug'        => 'policy-analysis',
			'landing'     => 'public-records-and-foia',
			'menu_icon'   => 'dashicons-media-document',
		),
		'twoia_guide'           => array(
			'singular'    => __( 'Guide', 'two-identities-anonymous' ),
			'plural'      => __( 'Guides', 'two-identities-anonymous' ),
			'menu_name'   => __( 'Guides', 'two-identities-anonymous' ),
			'description' => __( 'Lawful public-action guides for records, correction, source review, and privacy-aware publication.', 'two-identities-anonymous' ),
			'slug'        => 'guides',
			'landing'     => 'lawful-contact',
			'menu_icon'   => 'dashicons-welcome-learn-more',
		),
		'twoia_toolkit'         => array(
			'singular'    => __( 'Toolkit', 'two-identities-anonymous' ),
			'plural'      => __( 'Toolkits', 'two-identities-anonymous' ),
			'menu_name'   => __( 'Toolkits', 'two-identities-anonymous' ),
			'description' => __( 'Checklists, templates, and repeatable review aids that do not become operational abuse playbooks.', 'two-identities-anonymous' ),
			'slug'        => 'toolkits',
			'landing'     => 'methodology',
			'menu_icon'   => 'dashicons-clipboard',
		),
		'twoia_case_study'      => array(
			'singular'    => __( 'Case Study', 'two-identities-anonymous' ),
			'plural'      => __( 'Case Studies', 'two-identities-anonymous' ),
			'menu_name'   => __( 'Case Studies', 'two-identities-anonymous' ),
			'description' => __( 'Case studies that explain systems, evidence, affected rights, lessons, and correction paths.', 'two-identities-anonymous' ),
			'slug'        => 'case-studies',
			'landing'     => 'anonymous-hacktivist-collective',
			'menu_icon'   => 'dashicons-index-card',
		),
		'twoia_campaign'        => array(
			'singular'    => __( 'Campaign', 'two-identities-anonymous' ),
			'plural'      => __( 'Campaigns', 'two-identities-anonymous' ),
			'menu_name'   => __( 'Campaigns', 'two-identities-anonymous' ),
			'description' => __( 'Lawful public campaigns, public-comment drives, records pushes, and supportable civic asks.', 'two-identities-anonymous' ),
			'slug'        => 'campaigns',
			'landing'     => 'support',
			'menu_icon'   => 'dashicons-megaphone',
		),
		'twoia_update'          => array(
			'singular'    => __( 'Update', 'two-identities-anonymous' ),
			'plural'      => __( 'Updates', 'two-identities-anonymous' ),
			'menu_name'   => __( 'Updates', 'two-identities-anonymous' ),
			'description' => __( 'Short updates, correction notes, route changes, and ongoing research briefs.', 'two-identities-anonymous' ),
			'slug'        => 'updates',
			'landing'     => 'corrections-and-right-of-reply',
			'menu_icon'   => 'dashicons-update',
		),
	);
}

/**
 * Return editorial post types that behave like public articles.
 *
 * @return array
 */
function twoia_article_post_types() {
	return array_merge( array( 'post' ), array_keys( twoia_editorial_content_types() ) );
}

/**
 * Return all public 2IA content types that should be searchable.
 *
 * @return array
 */
function twoia_public_search_post_types() {
	return array_merge( twoia_article_post_types(), array( 'twoia_organization' ) );
}

/**
 * Register editorial content types.
 */
function twoia_register_editorial_content_types() {
	foreach ( twoia_editorial_content_types() as $post_type => $definition ) {
		register_post_type(
			$post_type,
			array(
				'labels'              => array(
					'name'                  => $definition['plural'],
					'singular_name'         => $definition['singular'],
					'menu_name'             => $definition['menu_name'],
					'name_admin_bar'        => $definition['singular'],
					'add_new'               => __( 'Add New', 'two-identities-anonymous' ),
					'add_new_item'          => sprintf(
						/* translators: %s: post type singular label. */
						__( 'Add New %s', 'two-identities-anonymous' ),
						$definition['singular']
					),
					'edit_item'             => sprintf(
						/* translators: %s: post type singular label. */
						__( 'Edit %s', 'two-identities-anonymous' ),
						$definition['singular']
					),
					'new_item'              => sprintf(
						/* translators: %s: post type singular label. */
						__( 'New %s', 'two-identities-anonymous' ),
						$definition['singular']
					),
					'view_item'             => sprintf(
						/* translators: %s: post type singular label. */
						__( 'View %s', 'two-identities-anonymous' ),
						$definition['singular']
					),
					'search_items'          => sprintf(
						/* translators: %s: post type plural label. */
						__( 'Search %s', 'two-identities-anonymous' ),
						$definition['plural']
					),
					'not_found'             => sprintf(
						/* translators: %s: post type plural label. */
						__( 'No %s found', 'two-identities-anonymous' ),
						$definition['plural']
					),
					'not_found_in_trash'    => sprintf(
						/* translators: %s: post type plural label. */
						__( 'No %s found in Trash', 'two-identities-anonymous' ),
						$definition['plural']
					),
					'all_items'             => sprintf(
						/* translators: %s: post type plural label. */
						__( 'All %s', 'two-identities-anonymous' ),
						$definition['plural']
					),
					'archives'              => sprintf(
						/* translators: %s: post type plural label. */
						__( '%s Archive', 'two-identities-anonymous' ),
						$definition['plural']
					),
					'attributes'            => sprintf(
						/* translators: %s: post type singular label. */
						__( '%s Attributes', 'two-identities-anonymous' ),
						$definition['singular']
					),
					'featured_image'        => __( 'Briefing image', 'two-identities-anonymous' ),
					'set_featured_image'    => __( 'Set briefing image', 'two-identities-anonymous' ),
					'remove_featured_image' => __( 'Remove briefing image', 'two-identities-anonymous' ),
					'use_featured_image'    => __( 'Use as briefing image', 'two-identities-anonymous' ),
				),
				'description'         => $definition['description'],
				'public'              => true,
				'show_in_rest'        => true,
				'menu_icon'           => $definition['menu_icon'],
				'has_archive'         => $definition['slug'],
				'rewrite'             => array(
					'slug'       => $definition['slug'],
					'with_front' => false,
				),
				'supports'            => array( 'title', 'editor', 'excerpt', 'thumbnail', 'author', 'revisions', 'custom-fields' ),
				'taxonomies'          => array( 'category', 'post_tag' ),
				'capability_type'     => 'post',
				'map_meta_cap'        => true,
				'delete_with_user'    => false,
				'exclude_from_search' => false,
			)
		);
	}
}
add_action( 'init', 'twoia_register_editorial_content_types' );