WordPress has standard post types like posts and pages, but the code below creates a new WordPress custom post type called Portfolio. The code saves the data you entered in the meta boxes (e.g., client name, project URL) whenever you save a portfolio item. Displays the portfolio items on the website’s frontend using a shortcode.
// Register Custom Post Type "Portfolio"
function create_portfolio_cpt() {
$labels = array(
'name' => 'Portfolios',
'singular_name' => 'Portfolio',
'menu_name' => 'Portfolios',
'name_admin_bar' => 'Portfolio',
'add_new' => 'Add New',
'add_new_item' => 'Add New Portfolio',
'new_item' => 'New Portfolio',
'edit_item' => 'Edit Portfolio',
'view_item' => 'View Portfolio',
'all_items' => 'All Portfolios',
'search_items' => 'Search Portfolios',
'not_found' => 'No portfolios found.',
);
$args = array(
'labels' => $labels,
'public' => true,
'show_in_menu' => true,
'supports' => array('title', 'editor', 'thumbnail', 'custom-fields'),
'has_archive' => true,
);
register_post_type('portfolio', $args);
}
add_action('init', 'create_portfolio_cpt');
// Add Meta Boxes for Portfolio
function portfolio_meta_boxes() {
add_meta_box(
'portfolio_details',
'Portfolio Details',
'portfolio_meta_box_callback',
'portfolio'
);
}
add_action('add_meta_boxes', 'portfolio_meta_boxes');
// Meta Box Callback Function
function portfolio_meta_box_callback($post) {
$client_name = get_post_meta($post->ID, 'client_name', true);
$project_url = get_post_meta($post->ID, 'project_url', true);
$project_date = get_post_meta($post->ID, 'project_date', true);
$project_description = get_post_meta($post->ID, 'project_description', true);
?>
<p>
<label for="client_name">Client Name:</label>
<input type="text" name="client_name" id="client_name" value="<?php echo esc_attr($client_name); ?>" />
</p>
<p>
<label for="project_url">Project URL:</label>
<input type="url" name="project_url" id="project_url" value="<?php echo esc_attr($project_url); ?>" />
</p>
<p>
<label for="project_date">Project Date:</label>
<input type="date" name="project_date" id="project_date" value="<?php echo esc_attr($project_date); ?>" />
</p>
<p>
<label for="project_description">Short Description:</label><br>
<textarea name="project_description" id="project_description" rows="4" style="width: 100%;"><?php echo esc_textarea($project_description); ?></textarea>
</p>
<?php
}
// Save Meta Box Data
function save_portfolio_meta_box_data($post_id) {
if (array_key_exists('client_name', $_POST)) {
update_post_meta($post_id, 'client_name', sanitize_text_field($_POST['client_name']));
}
if (array_key_exists('project_url', $_POST)) {
update_post_meta($post_id, 'project_url', esc_url($_POST['project_url']));
}
if (array_key_exists('project_date', $_POST)) {
update_post_meta($post_id, 'project_date', sanitize_text_field($_POST['project_date']));
}
if (array_key_exists('project_description', $_POST)) {
update_post_meta($post_id, 'project_description', sanitize_textarea_field($_POST['project_description']));
}
}
add_action('save_post', 'save_portfolio_meta_box_data');
// Display Portfolio on Frontend
function display_portfolio_items() {
$args = array('post_type' => 'portfolio', 'posts_per_page' => 10);
$loop = new WP_Query($args);
while ($loop->have_posts()) : $loop->the_post(); ?>
<h2><?php the_title(); ?></h2>
<p><?php the_content(); ?></p>
<p><strong>Client:</strong> <?php echo esc_html(get_post_meta(get_the_ID(), 'client_name', true)); ?></p>
<p><strong>Project URL:</strong> <a href="<?php echo esc_url(get_post_meta(get_the_ID(), 'project_url', true)); ?>" target="_blank"><?php echo esc_url(get_post_meta(get_the_ID(), 'project_url', true)); ?></a></p>
<p><strong>Project Date:</strong> <?php echo esc_html(get_post_meta(get_the_ID(), 'project_date', true)); ?></p>
<p><strong>Description:</strong> <?php echo esc_html(get_post_meta(get_the_ID(), 'project_description', true)); ?></p>
<?php endwhile;
wp_reset_postdata();
}
// Add shortcode for frontend display
add_shortcode('display_portfolio', 'display_portfolio_items');
Related Posts:
How to Create Custom Taxonomies in WordPress?
How to Add a Custom Taxonomy Filter to the WordPress…
How to Use WP_Query to Fetch and Display Custom…
Including only Custom Post Types in WordPress Search Results
How to Create a Custom WordPress Login Page?
How to use AJAX in WordPress: A Step-by-Step Guide