Content Types - Source Excerpt 01
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' );