[Shortcode] 커스텀 포스트 타입 등록하기 및 페이지 목록 만들기

Advanced Custom Fields라는 플러그인을 사용하려다가 맨땅에 코딩하는 것이 더 편할 것 같은 생각이 듭니다. 왜냐하면, 워드프레스 기본 function 외에 또 ACF의 라이브러리를 공부해야하기 때문에 머리가 지끈 거립니다. 그냥 워드프레스 기본 Function으로 해결할 수 있는 것은 플러그인 없이 해결해버리는 편이 편할 듯 싶습니다.

커스텀 포스트 타입 등록하기: 플러그인 만들기

  1. 워드프레스 ‘wp-content/plugins/’ 디렉토리 안에 ‘book-post-type-plugin’이라는 폴더를 만든다.
  2. book-post-type-plugin 디렉토리 안에 book-post-type-plugin.php 라는 파일을 만든다. 아래 참조

book-post-type-plugin.php 내용

플러그인 헤더

<?php
/*
Plugin Name: Book Post Type Plugin
Description: This plugin registers a custom post type called 'book'.
Version: 1.0
Author: Your Name
*/

// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

book 이라는 커스텀 포스트 타입 등록

// Register Custom Post Type
function custom_post_type_book() {

    $labels = array(
        'name'                  => _x( 'Books', 'Post Type General Name', 'book-post-type-plugin' ),
        'singular_name'         => _x( 'Book', 'Post Type Singular Name', 'book-post-type-plugin' ),
        'menu_name'             => __( 'Books', 'book-post-type-plugin' ),
        // 아래는 선택사항
        'name_admin_bar'        => __( 'Book', 'book-post-type-plugin' ),
        'archives'              => __( 'Book Archives', 'book-post-type-plugin' ),
        'attributes'            => __( 'Book Attributes', 'book-post-type-plugin' ),
        'parent_item_colon'     => __( 'Parent Book:', 'book-post-type-plugin' ),
        'all_items'             => __( 'All Books', 'book-post-type-plugin' ),
        'add_new_item'          => __( 'Add New Book', 'book-post-type-plugin' ),
        'add_new'               => __( 'Add New', 'book-post-type-plugin' ),
        'new_item'              => __( 'New Book', 'book-post-type-plugin' ),
        'edit_item'             => __( 'Edit Book', 'book-post-type-plugin' ),
        'update_item'           => __( 'Update Book', 'book-post-type-plugin' ),
        'view_item'             => __( 'View Book', 'book-post-type-plugin' ),
        'view_items'            => __( 'View Books', 'book-post-type-plugin' ),
        'search_items'          => __( 'Search Book', 'book-post-type-plugin' ),
        'not_found'             => __( 'Not found', 'book-post-type-plugin' ),
        'not_found_in_trash'    => __( 'Not found in Trash', 'book-post-type-plugin' ),
        'featured_image'        => __( 'Featured Image', 'book-post-type-plugin' ),
        'set_featured_image'    => __( 'Set featured image', 'book-post-type-plugin' ),
        'remove_featured_image' => __( 'Remove featured image', 'book-post-type-plugin' ),
        'use_featured_image'    => __( 'Use as featured image', 'book-post-type-plugin' ),
        'insert_into_item'      => __( 'Insert into book', 'book-post-type-plugin' ),
        'uploaded_to_this_item' => __( 'Uploaded to this book', 'book-post-type-plugin' ),
        'items_list'            => __( 'Books list', 'book-post-type-plugin' ),
        'items_list_navigation' => __( 'Books list navigation', 'book-post-type-plugin' ),
        'filter_items_list'     => __( 'Filter books list', 'book-post-type-plugin' ),
    );
    $args = array(
        'label'                 => __( 'Book', 'book-post-type-plugin' ),
        'description'           => __( 'Post Type Description', 'book-post-type-plugin' ),
        'labels'                => $labels,
        'supports'              => array( 'title', 'editor', 'thumbnail', 'page-attributes' ),
        'hierarchical'          => true, // Hierarchical like pages
        'public'                => true,
        'show_ui'               => true,
        'show_in_menu'          => true,
        'menu_position'         => 5,
        'menu_icon'             => 'dashicons-book-alt', // You can choose any icon from dashicons
        'show_in_admin_bar'     => true,
        'show_in_nav_menus'     => true,
        'can_export'            => true,
        'has_archive'           => true,
        'exclude_from_search'   => false,
        'publicly_queryable'    => true,
        'capability_type'       => 'post',
    );
    register_post_type( 'book', $args );

}
add_action( 'init', 'custom_post_type_book', 0 );

번역 파일을 읽어오는 부분 추가

function book_post_type_plugin_load_textdomain() {
    load_plugin_textdomain( 'book-post-type-plugin', false, dirname( plugin_basename( __FILE__ ) ) . '/languages/' );
}
add_action( 'plugins_loaded', 'book_post_type_plugin_load_textdomain' );

전체 코드 = 플러그인 헤더 + 커스텀 포스트 타입 등록 + 번역파일 로딩

번역파일 생성하기

여러분의 플러그인을 번역하는 방법은 Poedit와 같은 도구를 사용하여 번역 파일(.pot, .po 및 .mo 파일)을 생성하는 것입니다. 아래에 간단한 가이드를 제공해 드리겠습니다:

  1. Poedit 다운로드 및 설치: Poedit는 poedit.net에서 공식 웹사이트를 통해 다운로드할 수 있습니다. 컴퓨터에 설치하세요.
  2. .pot 파일 생성: 플러그인 디렉토리(book-post-type-plugin)에서 languages라는 새 디렉토리를 만드십시오. languages 디렉토리 안에 book-post-type-plugin.pot이라는 빈 파일을 생성하십시오. 이 파일은 번역의 템플릿 역할을 합니다.
  3. 번역 가능한 문자열 추출: Poedit를 열고 새 카탈로그를 만듭니다. 언어를 플러그인의 기본 언어로 설정하세요(예: 영어). 그런 다음, 카탈로그 > POT 파일에서 업데이트로 이동하여 이전에 생성한 book-post-type-plugin.pot 파일을 선택하십시오. Poedit는 플러그인에서 번역 가능한 문자열을 추출할 것입니다.
  4. 문자열 번역하기: Poedit는 플러그인에서 번역 가능한 모든 문자열을 나열할 것입니다. 이제 각 문자열을 원하는 언어로 번역하여 해당 필드에 번역합니다.
  5. 번역 저장하기: 모든 문자열을 번역했다면 번역을 저장합니다. Poedit는 .po 파일(예: book-post-type-plugin-en_US.po)과 .mo 파일(예: book-post-type-plugin-en_US.mo)을 book-post-type-plugin.pot 파일과 같은 디렉토리에 생성할 것입니다.
  6. 플러그인에서 번역 불러오기: 플러그인에서 번역을 불러오려면 load_plugin_textdomain() 함수를 사용하여 .mo 파일을 로드해야 합니다. 이미 플러그인에 이 함수가 포함되어 있습니다:
function book_post_type_plugin_load_textdomain() {
    load_plugin_textdomain( 'book-post-type-plugin', false, dirname( plugin_basename( __FILE__ ) ) . '/languages/' );
}
add_action( 'plugins_loaded', 'book_post_type_plugin_load_textdomain' );

.mo 파일이 플러그인의 텍스트 도메인에 따라 이름이 지어져 있고(e.g., book-post-type-plugin-en_US.mo), 플러그인의 languages 디렉토리에 위치해 있는지 확인하십시오.

이제 여러분의 플러그인은 번역 가능하며 사용자들은 Poedit를 사용하여 .po 파일에서 문자열을 번역하여 다양한 언어로 번역할 수 있습니다. 만약, 번역파일을 만들지 않으면 기본언어로만 표시됩니다.

[Shortcode] 커스텀 포스트 타입 페이지 목록 생성

아래 쇼트코드 스니펫을 WPcode나 code snippets라는 플러그인을 사용하여 워드프레스에 포함시킵니다.

function list_custom_post_type_pages_shortcode( $atts ) {
    // Extract shortcode attributes
    $atts = shortcode_atts(
        array(
            'post_type' => 'your_custom_post_type', // Default custom post type
            'level'     => 1 // Default level
        ),
        $atts,
        'list_custom_post_type_pages'
    );

    // Ensure 'level' attribute is numeric
    $level = intval( $atts['level'] );

    // Query arguments to get pages of the specified level of the custom post type
    $args = array(
        'post_type'      => $atts['post_type'],
        'post_parent'    => 0, // Only top-level pages
        'posts_per_page' => -1,
        'orderby'        => 'menu_order',
        'order'          => 'ASC'
    );

    // If level is greater than 1, query for the specific level
    if ( $level > 1 ) {
        $args['post_parent'] = 0; // Reset post_parent
        $args['meta_query'] = array(
            array(
                'key'     => '_menu_item_menu_item_parent',
                'value'   => '0',
                'compare' => '>',
                'type'    => 'NUMERIC',
            ),
        );
    }

    $pages = new WP_Query( $args );
    $output = '';

    if ( $pages->have_posts() ) {
        $output .= '<ul>';
        while ( $pages->have_posts() ) {
            $pages->the_post();
            $output .= '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
        }
        $output .= '</ul>';
    }

    wp_reset_postdata();

    return $output;
}
add_shortcode( 'list_custom_post_type_pages', 'list_custom_post_type_pages_shortcode' );

다음과 같이 쇼트코드를 사용할 수 있게 됩니다:

  • [list_custom_post_type_pages] to list top-level pages of the default custom post type.
  • [list_custom_post_type_pages post_type="your_custom_post_type"] to list top-level pages of a specific custom post type.
  • [list_custom_post_type_pages level="2" post_type="your_custom_post_type"] to list second-level pages of a specific custom post type.

[Shortcode] 커스텀 포스트 타입 자식 페이지 목록 생성

아래 쇼트코드 스니펫을 WPcode나 code snippets라는 플러그인을 사용하여 워드프레스에 포함시킵니다.

function list_children_shortcode( $atts ) {
    // Extract shortcode attributes
    $atts = shortcode_atts(
        array(
            'post_type' => 'your_custom_post_type' // Default custom post type
        ),
        $atts,
        'list_children'
    );

    // Query arguments
    $args = array(
        'post_type'      => $atts['post_type'],
        'post_parent'    => get_the_ID(),
        'posts_per_page' => -1,
        'orderby'        => 'menu_order',
        'order'          => 'ASC'
    );

    $children = new WP_Query( $args );
    $output = '';

    if ( $children->have_posts() ) {
        $output .= '<ul>';
        while ( $children->have_posts() ) {
            $children->the_post();
            $output .= '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
        }
        $output .= '</ul>';
    }

    wp_reset_postdata();

    return $output;
}
add_shortcode( 'list_children', 'list_children_shortcode' );

Shortcode 형식:

    Leave a Comment