WordPress custom post content widget

Задача

В WP необходимо создать отдельный тип записей и виджет для вывода их контента в сайтбаре. Виджет при добавлении в сайт будет предлагать в виде дропдауна список кастомных записей для выбора.

Шаг 1. Создание кастомного типа

В functions.php необходимо прописать следующее:

function register_post_type_txt() {
    register_post_type('txt',array(
            'label' => __('Text'),
            'public' => true,
            'supports' => array('title', 'editor')
    ));
}
add_action('init', 'register_post_type_txt');

После чего в админке появится новосозданный кастомный тип записей

screenshot

Подробнее о создании кастомных полей: register_post_type

Шаг 2. Вывод содержимого поста в теме

Где угодно в файлах темы (я для примера прописал в header.php) прописать следующее:

<?php
$postId = 50;
$queried_post = get_post($postId);
$title = $queried_post->post_title;
$content = $queried_post->post_content;
echo _e($title);
echo '<br />';
echo _e($content);
?>

Примечание: в функцию get_post - обязательно должна передаваться переменная, иначе получим эксепшн.

Подробнее о ф-ии get_post

Примечание: в проекте для которого все это делалось, юзается плагин qTranslate для создания многоязычного сайта, этот плагин записывает через комменты все переводы в один пост, для того чтобы отобразить нужный, необходимо прогнать текст через ф-ию _e()

Эта заготовка будет использоваться плагином, для вывода содержимого поста.

Шаг 3. Создание кастомных сайтбаров

В файле functions.php необходимо прописать следующее:

if ( function_exists('register_sidebar') ) {

    register_sidebar(array(
        'name'  => 'home_page_text',
        'before_widget' => '',
        'after_widget' => '',
        'before_title' => '',
        'after_title' => '',
    ));

}

Тем самым мы добавляем новый сайтбар для размещения виджетов, соотв. в дальнейшем плодим этих сайдтбаров, столько, сколько нам надо.

После добавления этого кода на странице виджетов должен появиться новый сайтбар:

screenshot

Шаг 4. Вывод кастомных сайтбаров

Где угодно в файлах темы (я для примера пробывал в header.php) прописываем следующее:

<?php dynamic_sidebar( 'home_page_text' )?>

Эта ф-ия выведет содержимое кастомного сайтбара, подробнее: dynamic_sidebar

Шаг 5. Создание виджета (собираем все в кучу)

Описание create wordpress widgets

Код /wp-content/plugins/custom-post-type-widget.php:

<?php
/**
    * Plugin Name: Custom Post Type Widget
    * Plugin URI: http://photowizard.com
    * Description: Widget to display custom post content
    * Version: 0.1
    * Author: mac
    * Author URI: http://photowizard.com.ua
    */

add_action( 'widgets_init', 'widgets_init_custom_post_type_widget' );

function widgets_init_custom_post_type_widget() {
    register_widget( 'Custom_Post_Type_Widget' );
}

class Custom_Post_Type_Widget extends WP_Widget {

    function Custom_Post_Type_Widget() {
        parent::WP_Widget(false, $name = 'Custom_Post_Type_Widget');
    }

    function widget( $args, $instance ) {
        extract( $args );

        $txtId = isset($instance['txtId']) ? $instance['txtId'] : false;

        echo $before_widget;
        if ( $txtId ) {
            $queried_post = get_post($txtId);
            $content = $queried_post->post_content;
            echo _e($content);
        }
        echo $after_widget;
    }

    function update( $new_instance, $old_instance ) {
        $instance = $old_instance;
        $instance['txtId'] = $new_instance['txtId'];
        return $instance;
    }

    function form( $instance ) {
        $txtId = isset($instance['txtId']) ? $instance['txtId'] : 0;
        $opts = '';
        wp_reset_query();
        $my_query = null;
        $my_query = new WP_Query(array(
            'post_type' => 'txt',
            'post_status' => 'publish',
            'posts_per_page' => -1,
            'caller_get_posts'=> 1
        ));
        if( $my_query->have_posts() ) {
            while ($my_query->have_posts()) : $my_query->the_post();
                $sel = ($txtId == get_the_ID()) ? ' selected="selected" ' : '';
                $opts = $opts . '<option ' . $sel . ' value="' . get_the_ID() . '">' . get_the_title() . '</option>';
            endwhile;
        }
        wp_reset_query();

        echo '<p><select id="' . $this->get_field_id( 'txtId' ) . '" name="' . $this->get_field_name( 'txtId' ) . '" class="widefat" style="width:100%;"><option value="0">- select -</option>' . $opts . '</select></p>';
    }
}
?>

Примечание: Очень важно в форме правильно использовать методы $this->get_field_id и $this->get_field_name иначе данные не будут сохранятся и будет куча гемороя.

screenshot