Τρισδιάστατα project: το custom post type


Για τα τρισδιάστατα project ο κώδικας έχει πολύ μικρές διαφορές στην ουσία του (πέρα από διαφορετικά labels και ονόματα, όπως το όνομα του custom post type) και έτσι θα αντιγράψω εδώ τον κώδικα του κάθε αρχείου ολόκληρο, από αρχή μέχρι τέλος.

dh-architect-plugin.php

Το αρχείο dh-architect-plugin.php (οι 4 γραμμές προστέθηκαν για το Visualization Project)

<?php
/**
 * Plugin Name:	Archi Tect
 * Description:	Implement 2 CPTs, and blocks to update some of their metadata.
 * Version:	1.0
 * Requires at least:	5.9
 * Requires PHP: 7.1
 * Author:	Kostas Stavrou
 * Author URI:	https://kstavrou.gr
 * License:	GPL v2 or later
 * License URI:	https://www.gnu.org/licenses/gpl-2.0.html
 * Text Domain:	dh-architect-plugin
 * Domain Path:	/languages
 */

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

include_once "inc" . DIRECTORY_SEPARATOR . "autoload.php";

/* Load text domain */
add_action( 'plugins_loaded', ['DasodaHae\Architect\Plugin', 'LoadTextDomain'] );

register_activation_hook( __FILE__ , ['DasodaHae\Architect\Plugin', 'Activate'] );
register_deactivation_hook( __FILE__ , ['DasodaHae\Architect\Plugin', 'Deactivate'] );
register_uninstall_hook( __FILE__ , ['DasodaHae\Architect\Plugin', 'Uninstall'] );

/* Register the "Architecture Project" CPT */
add_action( 'init', ['DasodaHae\Architect\ArchitectureProject', 'RegisterCPT'] );
/* Filter the post updated messages for the Architecture Project CPT */
add_filter( 'post_updated_messages', ['DasodaHae\Architect\ArchitectureProject', 'UpdatePostMessages'] );

/* Register the "Visualization Project" CPT */
add_action( 'init', ['DasodaHae\Architect\VisualizationProject', 'RegisterCPT'] );
/* Filter the post updated messages for the Visualization Project CPT */
add_filter( 'post_updated_messages', ['DasodaHae\Architect\VisualizationProject', 'UpdatePostMessages'] );

src/Plugin.php

Το αρχείο src/Plugin.php στο οποίο καλούμε και τις αντίστοιχες συναρτήσεις (methods) της κλάσης (class) VisualizationProject. Η δομή των permalinks ενημερώνεται αν έχει γίνει επιτυχώς καταχώρηση τουλάχιστον του ενός από τα δύο custom post types. Το αρχείο τώρα περιέχει τα ακόλουθα:

<?php
namespace DasodaHae\Architect;

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

class Plugin {
    public static function LoadTextDomain() {
        $path = basename( dirname( __DIR__ ) ) . '/languages/';
        $result = load_plugin_textdomain( 'dh-architect-plugin', false, $path );
    }

    public static function Activate() {
        // Register Architecture Project CPT
        $result_arch = ArchitectureProject::RegisterCPT();
        if ( ! is_wp_error( $result_arch ) ) {
            // Add capabilities to the Roles for the CPT
            ArchitectureProject::AddCapabilities();
        }
        // Register Visualization Project CPT
        $result_3dviz = VisualizationProject::RegisterCPT();
        if ( ! is_wp_error( $result_3dviz ) ) {
            // Add capabilities to the Roles for the CPT
            VisualizationProject::AddCapabilities();
        }
        if ( ( ! is_wp_error( $result_arch ) ) || ( ! is_wp_error( $result_3dviz ) ) ) {
            // Clear and recreate the permalinks after the post type has been registered
            flush_rewrite_rules();
        }
    }

    public static function Deactivate() {
        // Unregister Architecture Project CPT
        $result_arch = unregister_post_type( 'dh_at_archproj' );
        if ( ! is_wp_error( $result_arch ) ) {
            // Remove capabilities from the Roles for the CPT
            ArchitectureProject::RemoveCapabilities();
        }
        // Unregister Visualization Project CPT
        $result_3dviz = unregister_post_type( 'dh_at_3dvizproj' );
        if ( ! is_wp_error( $result_3dviz ) ) {
            // Remove capabilities from the Roles for the CPT
            VisualizationProject::RemoveCapabilities();
        }
        if ( ( ! is_wp_error( $result_arch ) ) || ( ! is_wp_error( $result_3dviz ) ) ) {
            // Clear the permalinks to remove our CPT rules from the database
            flush_rewrite_rules();
        }
    }

    public static function Uninstall() {
        // at the moment do nothing
    }
}

και τέλος δημιουργούμε το αρχείο src/VisualizationProject.php που περιέχει τον κώδικα της κλάσης (class) VisualizationProject, αντίστοιχα με το ArchitectureProject. Τα περιεχόμενα του αρχείου είναι τα εξής:

<?php
namespace DasodaHae\Architect;

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

class VisualizationProject {
    public static function UpdatePostMessages( $messages) {
        global $post, $post_id;
        $messages['dh_at_3dvizproj'] = array(
            0 => '',
            /* translators: Pass project URI as string parameter. */
            1 => sprintf( __('3d-visualization project updated. <a href="%s">View project</a>', 'dh-architect-plugin' ), esc_url( get_permalink($post_id) ) ),
            2 => __('Custom field updated.' , 'dh-architect-plugin' ),
            3 => __('Custom field deleted.' , 'dh-architect-plugin' ),
            4 => __('3d-visualization project updated.' , 'dh-architect-plugin' ),
            /* translators: Passed parameter is the custom post's date timestamp of revision . */
            5 => isset($_GET['revision']) ? sprintf( __('3d-visualization project restored to revision from %s',  'dh-architect-plugin' ), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false,
            /* translators: Pass project URI as string parameter. */
            6 => sprintf( __('3d-visualization project published. <a href="%s">View project</a>' , 'dh-architect-plugin' ), esc_url( get_permalink($post_id) ) ),
            7 => __('3d-visualization project saved.' , 'dh-architect-plugin' ),
            /* translators: Pass project's preview URI as string parameter. */
            8 => sprintf( __('3d-visualization project submitted. <a target="_blank" href="%s">Preview project</a>',  'dh-architect-plugin' ), esc_url( add_query_arg( 'preview', 'true', get_permalink($post_id) ) ) ),
            /* translators: Pass project's scheduled date and URI as string parameter. */
            9 => sprintf( __('3d-visualization project scheduled for: <strong>%1$s</strong>. <a target="_blank" href="%2$s">Preview project</a>' , 'dh-architect-plugin' ), date_i18n( __( 'M j, Y @ G:i' ), strtotime( $post->post_date ) ), esc_url( get_permalink($post_id) ) ),
            /* translators: Pass project's preview URI as string parameter. */
            10 => sprintf( __('3d-visualization project draft updated. <a target="_blank" href="%s">Preview project</a>' , 'dh-architect-plugin' ), esc_url( add_query_arg( 'preview', 'true', get_permalink($post_id) ) ) ),
        );
        return $messages;
    }

    public static function RegisterCPT() {
	    /* Remember to keep the following in sync with the ones
            set for the custom post type admin notices, using
            the 'post_updated_messages' filter
        */
        $labels = array(
            'name' => __( '3d-visualization projects' , 'dh-architect-plugin' ),
            'singular_name' => __( '3d-visualization project' , 'dh-architect-plugin' ),
            'add_new' => __( 'Add new' , 'dh-architect-plugin' ),
            'add_new_item' => __( 'Add new 3d-visualization project' , 'dh-architect-plugin' ),
            'edit_item' => __( 'Edit 3d-visualization project' , 'dh-architect-plugin' ),
            'new_item' => __( 'New 3d-visualization project' , 'dh-architect-plugin' ),
            'view_item' => __( 'View 3d-visualization project' , 'dh-architect-plugin' ),
            'view_items' => __( 'View 3d-visualization projects' , 'dh-architect-plugin' ),
            'search_items' => __( 'Search 3d-visualization projects' , 'dh-architect-plugin' ),
            'not_found' => __( 'No 3d-visualization projects found' , 'dh-architect-plugin' ),
            'not_found_in_trash' => __( 'No 3d-visualization projects found in Trash' , 'dh-architect-plugin' ),
            'all_items' => __( 'All 3d-visualization projects' , 'dh-architect-plugin' ),
            'archives' => __( '3d-visualization project archives' , 'dh-architect-plugin' ),
            'attributes' => __( '3d-visualization projects attributes' , 'dh-architect-plugin' ),
            'insert_into_item' => __( 'Insert into 3d-visualization project' , 'dh-architect-plugin' ),
            'uploaded_to_this_item'	=> __( 'Uploaded to this 3d-visualization project',  'dh-architect-plugin' ),
            'featured_image' => __( 'Featured image' , 'dh-architect-plugin' ),
            'set_featured_image' => __( 'Set featured image' , 'dh-architect-plugin' ),
            'remove_featured_image'	=> __( 'Remove featured image' , 'dh-architect-plugin' ),
            'use_featured_image' => __( 'Use as featured image' , 'dh-architect-plugin' ),
            'menu_name' => __( '3d-visualization projects' , 'dh-architect-plugin' ),
            'filter_items_list'	=> __( 'Filter 3d-visualization projects list' , 'dh-architect-plugin' ),
            'items_list_navigation'	=> __( '3d-visualization projects list navigation' , 'dh-architect-plugin' ),
            'items_list' => __( '3d-visualization projects list' , 'dh-architect-plugin' ),
            'item_published' => __( '3d-visualization project published' , 'dh-architect-plugin' ),
            'item_published_privately' => __( '3d-visualization project published privately' , 'dh-architect-plugin' ),
            'item_reverted_to_draft' => __( '3d-visualization project reverted to draft' , 'dh-architect-plugin' ),
            'item_scheduled' => __( '3d-visualization project scheduled' , 'dh-architect-plugin' ),
            'item_updated' => __( '3d-visualization project updated' , 'dh-architect-plugin' ),
        );
        $args = array(
            'labels' => $labels,
            'description' => '3d-visualization projects',
            'public' => true,
            'exclude_from_search' => false,
            'publicly_queryable' => true,
            'show_in_rest' => true,
            'rest_base' => 'visualization-projects',
            'menu_position' => 23,
            'menu_icon' => 'dashicons-admin-page',
            'capability_type' => 'visualization_project',
            'map_meta_cap' => true,
            'supports' => array(
                'title',
                'editor',
                'thumbnail',
                'author',
                'custom-fields',
            ),
            'has_archive' => 'visualization-projects',
            'rewrite' => array(
                'slug' => 'visualization-projects',
                'with_front' => false,
                'feeds'	=> false,
                'pages'	=> true,
            ),
            'query_var' => 'visualization-projects',
            'can_export' => true,
        );
        return register_post_type( 'dh_at_3dvizproj', $args );
    }

    public static function AddCapabilities() {
        // Add caps for Administrator role.
        $role = get_role( 'administrator' );
        $role->add_cap( 'edit_visualization_projects' );
        $role->add_cap( 'edit_others_visualization_projects' );
        $role->add_cap( 'edit_published_visualization_projects' );
        $role->add_cap( 'publish_visualization_projects' );
        $role->add_cap( 'delete_visualization_projects' );
        $role->add_cap( 'delete_others_visualization_projects' );
        $role->add_cap( 'delete_published_visualization_projects' );
        $role->add_cap( 'delete_private_visualization_projects' );
        $role->add_cap( 'edit_private_visualization_projects' );
        $role->add_cap( 'read_private_visualization_projects' );
        // Add caps for Editor role.
        $role = get_role( 'editor' );
        $role->add_cap( 'edit_visualization_projects' );
        $role->add_cap( 'edit_others_visualization_projects' );
        $role->add_cap( 'edit_published_visualization_projects' );
        $role->add_cap( 'publish_visualization_projects' );
        $role->add_cap( 'delete_visualization_projects' );
        $role->add_cap( 'delete_others_visualization_projects' );
        $role->add_cap( 'delete_published_visualization_projects' );
        $role->add_cap( 'delete_private_visualization_projects' );
        $role->add_cap( 'edit_private_visualization_projects' );
        $role->add_cap( 'read_private_visualization_projects' );
        // Add caps for Author role.
        $role = get_role( 'author' );
        $role->add_cap( 'edit_visualization_projects' );
        $role->add_cap( 'edit_published_visualization_projects' );
        $role->add_cap( 'publish_visualization_projects' );
        $role->add_cap( 'delete_visualization_projects' );
        $role->add_cap( 'delete_published_visualization_projects' );
        // Add caps for Contributor role.
        $role = get_role( 'contributor' );
        $role->add_cap( 'edit_visualization_projects' );
        $role->add_cap( 'delete_visualization_projects' );
    }

    public static function RemoveCapabilities() {
        // Remove caps for Administrator role.
        $role = get_role( 'administrator' );
        $role->remove_cap( 'edit_visualization_projects' );
        $role->remove_cap( 'edit_others_visualization_projects' );
        $role->remove_cap( 'edit_published_visualization_projects' );
        $role->remove_cap( 'publish_visualization_projects' );
        $role->remove_cap( 'delete_visualization_projects' );
        $role->remove_cap( 'delete_others_visualization_projects' );
        $role->remove_cap( 'delete_published_visualization_projects' );
        $role->remove_cap( 'delete_private_visualization_projects' );
        $role->remove_cap( 'edit_private_visualization_projects' );
        $role->remove_cap( 'read_private_visualization_projects' );
        // Remove caps for Editor role.
        $role = get_role( 'editor' );
        $role->remove_cap( 'edit_visualization_projects' );
        $role->remove_cap( 'edit_others_visualization_projects' );
        $role->remove_cap( 'edit_published_visualization_projects' );
        $role->remove_cap( 'publish_visualization_projects' );
        $role->remove_cap( 'delete_visualization_projects' );
        $role->remove_cap( 'delete_others_visualization_projects' );
        $role->remove_cap( 'delete_published_visualization_projects' );
        $role->remove_cap( 'delete_private_visualization_projects' );
        $role->remove_cap( 'edit_private_visualization_projects' );
        $role->remove_cap( 'read_private_visualization_projects' );
        // Remove caps for Author role.
        $role = get_role( 'author' );
        $role->remove_cap( 'edit_visualization_projects' );
        $role->remove_cap( 'edit_published_visualization_projects' );
        $role->remove_cap( 'publish_visualization_projects' );
        $role->remove_cap( 'delete_visualization_projects' );
        $role->remove_cap( 'delete_published_visualization_projects' );
        // Remove caps for Contributor role.
        $role = get_role( 'contributor' );
        $role->remove_cap( 'edit_visualization_projects' );
        $role->remove_cap( 'delete_visualization_projects' );
    }
}

Σε αυτό το σημείο, έχουμε ολοκληρώσει με όλο το βασικό κορμό των δύο custom post types που χρειαζόμαστε.