4. 3 カテゴリ別投稿等作成

投稿新規作成, 序文・テンプレート作成

カテゴリ別投稿の新規作成

 一般ユーザーがカテゴリ別投稿を作成しやすいようにします。タイトルと本文を入力するだけです。
 処理の流れは次の通りです。
   1.投稿作成パラメータ設定
   2.データベースに投稿を追加
   3.投稿のスラッグ設定
   4.投稿を更新
   5.投稿作成画面にリダイレクト

 このコードを起動させるのには、アドミニメニューにメニューを登録する必要があります。アドミニメニューの設定は別途説明します。
 パラメータ'hk_light_type'は、簡易版であることを示すパラメータです。アドミニメニュー登録時に付加します。
 パラメータ'cat_post_list'は、カテゴリ別投稿関連を表します。アドミニメニュー登録時に付加します。
 パラメータ'hk_cat_id'は、簡易版のカテゴリIDを示すパラメータです。アドミニメニュー登録時に付加します。
 カテゴリスラッグは、投稿スラッグの作成に使用します。カテゴリスラッグに投稿IDをつけて投稿スラッグにしています。
 投稿作成パラメータの'post_title'は、'自動下書き'にします。このようにすることで投稿入力時にタイトル未入力状態になります。また、'post_status'は、'auto-draft'にします。
 新規投稿をデータベースに登録し、投稿IDを取得して、投稿スラッグを設定し、投稿を更新し、投稿作成画面にリダイレクトします。
 関数 hk_easy_get_edit_post_url は、“カテゴリ別投稿一覧(簡易版)”に記載しています。
 フック'admin_action_'は、admin.php の最後にあります。admin.php の処理が終了したところで、“分岐”します。

コード

// --------------------------------
// カテゴリ別投稿の新規作成
// --------------------------------
function hk_post_new() {
    // hk_light_type
    if ( ! isset( $_REQUEST['hk_light_type'] ) )    exit;
    $light_type = $_REQUEST['hk_light_type'];
    if ( $light_type != 'cat_post_list' )           exit;
    // カテゴリID
    if ( ! isset( $_REQUEST['hk_cat_id'] ) )        exit;
    $cat_id = $_REQUEST['hk_cat_id'];
    // カテゴリスラッグ
    $cat_obj  = get_category( $cat_id );
    $cat_slug = $cat_obj->slug;
    // 新投稿パラメータ
    $new_post = array(
        'post_title'     => '自動下書き',
        'post_category'  => array( $cat_id ),
        'post_name'      => '',
        'post_content'   => '',
        'post_excerpt'   => '',
        'post_author'    => get_current_user_id(),
        'post_password'  => '',
        'post_status'    => 'auto-draft',
        'post_type'      => 'post',
        'tags_input'     => array(),
        'comment_status' => 'closed',
        'ping_status'    => 'closed',
    );
    // データベースに投稿を追加
    $post_id = wp_insert_post( $new_post );
    // 新投稿のスラッグ
    $post_name = $cat_slug.'-'.$post_id;
    $new_post = array(
        'ID'             => $post_id,
        'post_name'      => $post_name,
    );
    // データベースに追加した投稿を更新
    wp_update_post( $new_post );
    // 投稿作成画面にリダイレクト
    $url = hk_easy_get_edit_post_url( $post_id, $cat_id );
    wp_redirect( $url );
    exit;
}
add_action( 'admin_action_hk_post_new', 'hk_post_new' );

カテゴリ別序文・テンプレートの作成

 一般ユーザーがカテゴリ別の序文とテンプレートを作成しやすいようにします。本文を入力するだけです。序文は、テーマをカスタマイズして、カテゴリアーカイブの冒頭に表示しています。テンプレートは、定型文の入力に利用しています。この投稿でも利用しています。
 処理の流れは次の通りです。
  1.既存の序文・テンプレートの有無チェック
  2.既存の序文・テンプレートがある場合、更新編集の投稿作成画面にリダイレクト
  3.既存の序文・テンプレートがない場合、次の手順で新規作成
  3.1 投稿作成パラメータ設定
  3.2 データベースに投稿を追加
  3.3 投稿のスラッグ設定
  3.4 投稿を更新
  3.5 投稿作成画面にリダイレクト

 投稿作成パラメータは、“カテゴリ別投稿の新規作成”と類似していますが、'post_title'と'post_status'が異なります。
 関数 hk_easy_get_edit_post_url は、“カテゴリ別投稿一覧(簡易版)”に記載しています。
 フックは、“カテゴリ別投稿の新規作成”と同じです。admin.php の処理が終了したところで、“分岐”します。

コード

// --------------------------------
// カテゴリ別序文の作成
// --------------------------------
function hk_post_new_pref() {
    hk_easy_post_new_pref_temp( '序文' );
    exit;
}
add_action( 'admin_action_hk_post_new_pref', 'hk_post_new_pref' );

// --------------------------------
// カテゴリ別テンプレートの作成
// --------------------------------
function hk_post_new_temp() {
    hk_easy_post_new_pref_temp( 'テンプレート' );
    exit;
}
add_action( 'admin_action_hk_post_new_temp', 'hk_post_new_temp' );

// --- サブルーチン ---------------
// 序文・テンプレートの作成
// --------------------------------
function hk_easy_post_new_pref_temp( $title ) {
    // hk_light_type
    if ( ! isset( $_REQUEST['hk_light_type'] ) )    exit;
    $light_type = $_REQUEST['hk_light_type'];
    if ( $light_type != 'cat_post_list' )           exit;
    // カテゴリID
    if ( ! isset( $_REQUEST['hk_cat_id'] ) )        exit;
    $cat_id = $_REQUEST['hk_cat_id'];
    // カテゴリスラッグ
    $cat_obj  = get_category( $cat_id );
    $cat_slug = $cat_obj->slug;
    // 有無チェック
    $args = array(
        'category__in'   => $cat_id,
        'post_status'    => 'any',
        'orderby'        => 'date',
        'order'          => 'DESC',
        'posts_per_page' => -1,
    );
    $my_query = new WP_Query( $args );
    $post_id = 0;
    if ( $my_query->have_posts() ) {
        while ( $my_query->have_posts() ) {
            $my_query->the_post();
            $pref_post = get_post();
            if (( isset( $pref_post->post_title ) )
             && ( $pref_post->post_title == $title )) {
                $post_id = $pref_post->ID;
                break;
            }
        }
        wp_reset_postdata();
    }
    // 更新編集
    if ( $post_id ) {
        // 投稿作成画面にリダイレクト
        $url = hk_easy_get_edit_post_url( $post_id, $cat_id );
        wp_redirect( $url );
        exit;
    }
    // 新規作成
    // 新投稿パラメータ
    $new_post = array(
        'post_title'     => $title,
        'post_category'  => array( $cat_id ),
        'post_name'      => '',
        'post_content'   => '',
        'post_excerpt'   => '',
        'post_author'    => get_current_user_id(),
        'post_password'  => '',
        'post_status'    => 'draft',
        'post_type'      => 'post',
        'tags_input'     => array(),
        'comment_status' => 'closed',
        'ping_status'    => 'closed',
    );
    // データベースに投稿を追加
    $post_id = wp_insert_post( $new_post );
    // 新投稿のスラッグ
    $post_name = $cat_slug.'-'.$post_id;
    $new_post = array(
        'ID'             => $post_id,
        'post_name'      => $post_name,
    );
    // データベースに追加した投稿を更新
    wp_update_post( $new_post );
    // 投稿作成画面にリダイレクト
    $url = hk_easy_get_edit_post_url( $post_id, $cat_id );
    wp_redirect( $url );
    exit;
}

 このプログラムをお使いになる場合は、お使いになる方の自己責任でお願いします。

関連

更新日:2016/03/24
掲載日:2016/01/12