サポート » プラグイン » カスタム投稿タイプでショートコードを発行するには?

  • Tonokix

    (@magictoolpc)


    はじめまして、富木と申します。

    現在、ワードプレスの勉強として
    自作プラグインを作っています。

    今回は「カスタム投稿タイプとショートコード」を
    覚えようと以下のような
    プラグインを作成テストしている最中です。

    特に何か意味のあるプラグインではありませんが、
    勉強として作っておりますのでご容赦ください。。


    1. カスタム投稿タイプでタイトルと本文を登録する
    2. 登録した本文を“投稿・固定ページ”からショートコードで呼び出して表示する

    カスタム投稿タイプでは、
    記事毎でそれぞれ本文が存在していると思いますので
    本文箇所のみを、投稿(or固定ページ)側から、
    ショートコードで呼び出したいです。

    一応、さきほどようやく「1」が実装できたのですが
    カスタム投稿タイプ側で登録されている
    『本文(WP標準エディター内の要素)』のみを
    ショートコードで呼び出す方法が解らず困っています。

    
    function create_posttype() {
      register_post_type('sample_item',
        array(
          'labels'        => array( 
            'name'               => '商品一覧',
            'singular_name'      => '商品',
            'menu_name'          => '商品登録',
            'name_admin_bar'     => '商品追加',
            'all_items'          => '商品一覧',
            'add_new'            => '商品追加',
            'add_new_item'       => '商品の登録',
            'edit_item'          => '商品の編集',
            'new_item'           => '新規商品',
            'view_item'          => 'この商品のページを表示',
            'search_items'       => '商品を検索',
            'not_found'          => '商品が見つかりませんでした',
            'not_found_in_trash' => 'ゴミ箱の中に商品が見つかりませんでした',
            'parent_item_colon'  => '',
          ),
     
          'description'   => '商品の登録ページです',
          'public'        => true,
          'menu_position' => 5,
          'menu_icon'     => 'dashicons-smiley',
          'hierarchical'  => false,
          'supports' => array(
            'title',
            'editor',
            'thumbnail',
          ),
          'has_archive'   => true,
          'rewrite'       => array(
            'slug' => 'item'
          ),
          'query_var'     => false,
          'can_export'    => true,
        )
      );
    }
    add_action('init', 'create_posttype');
    

    ContactForm7のように、
    一つ毎にショートコードを持たせるような
    実装をしてみたいのですが方法はございますでしょうか?

    あと、テーマ側のfunctions.phpで使えているコードを、
    そのままプラグイン側に貼り付けた場合に
    正常動作しないことが多かったのですが、
    これらは仕方がないことでしょうか?

    カスタム投稿タイプの本文(WP標準エディター)の
    ‘続きを読む’ボタンなどその他いくつか不要な装飾ボタンを
    非表示にしたかったのですが、
    テーマ側のfunctions.phpでは
    動作するソースが全く動作しませんでした・・・

    また、カスタム投稿タイプ内にある
    WP標準エディターに、他プラグインによって追加された
    装飾ボタンもあるようで、
    そういった点でもスッキリできればと
    考えております。。

    プラグインにお詳しい方、
    お力添えいただければ嬉しいです。

    お忙しいなか申し訳ございません。
    宜しくお願い致します。

12件の返信を表示中 - 1 - 12件目 (全12件中)
  • Tonokix

    (@magictoolpc)

    稚拙な文章でわかりづらいですね。。スミマセン。

    要約すると以下を行いたいのですが、可能でしょうか?

    |カスタム投稿をプラグインを使って実装し、
    |投稿(または固定ページ)側からショートコードで抽出する方法

    ヒントだけでもいただけますとありがたいです。
    WPプロの方、お力添えの程宜しくお願い致します。

    適当ですが[get_my_content id=投稿ID]で投稿IDを指定して本文を呼び出します。

    function get_my_content_shortcode( $atts ) {
    	extract( shortcode_atts(
    		array(
    			'id'  => '',
    		), $atts ) );
    	$content = get_page( $id );
    	return $content -> post_content;
    }
    add_shortcode( 'get_my_content', 'get_my_content_shortcode' );
    Honda

    (@rocketmartue)

    ショートコードの実装には、カスタム投稿タイプの登録とは別にショートコードの登録が必要です。
    sample_item の投稿のスラッグを利用して本文を呼び出す場合は、以下の通りです。
    'post_type' => 'sample_item',の部分を'post_type' => 'page',に変更すれば固定ページの本文、'post_type' => 'post',に変更すれば、通常の投稿の本文を呼び出せます。

    // sample_item の投稿ページの本文を呼び出す
    // [si_content name=スラッグ]
    function si_post_func($atts) {
    	extract(shortcode_atts(array(
    		'name'      => 'defalt',
    		'post_type' => 'sample_item',
    		'class'     => 'post_content',
    		'show'      => 'content',
    	), $atts));
    	$args = array(
    		'name'      => $name,
    		'post_type' => $post_type,
    		'class'     => $class,
    	);
    	$the_query = new WP_Query( $args );
    	while ( $the_query->have_posts() ) : $the_query->the_post();
    	$content = apply_filters( 'the_content', get_the_content() );
    	$content = str_replace( ']]>', ']]>', $content );
    	endwhile;
    	wp_reset_postdata();return '<div id="'. $name .'_content" class="'. $class.'">' . $content . '</div>';
    }
    add_shortcode( 'si_content', 'si_post_func', true );
    • この返信は2 年、 2 ヶ月前に  Honda さんが編集しました。
    • この返信は2 年、 2 ヶ月前に  Honda さんが編集しました。
    Tonokix

    (@magictoolpc)

    Rocket Martue様

    早々のご返答ありがとうございます。

    ショートコードを利用するには別のソースが必要なんですね。
    詳しいご回答、大変助かりました。。

    無事、希望通りの読込みが実現できました。
    心より感謝申し上げます。

    もしよろしければ、併せてご教授いただきたいのですが、

    [si_content id="xxxx"]

    として、呼び出すことも可能でしょうか?

    試してみたところ、

    [si_content name=スラッグ名]

    でしたら、問題なく表示されたのですが、
    id指定すると、何も表示がされませんでした。

    ContactForm7のように、カスタム投稿一覧で、各投稿に対して
    ショートコードをそれぞれで表示してみたく思っております。

    スラッグでもidでも表示ができれば一番ありがたいのですが、可能でしょうか・・?

    もしよろしければ、ご教授いただけますと幸いです。

    お手数をおかけいたしますが、
    何卒宜しくお願い致します。

    Tonokix

    (@magictoolpc)

    manbo様

    早々のご返答ありがとうございます。
    勉強になります。参考にさせていただきますm(_ _)m

    Honda

    (@rocketmartue)

    今ちょっと時間がないので、とりあえず
    shortcode atts

    WP_Query

    この辺を参考にしてみてください。

    Tonokix

    (@magictoolpc)

    Rocket Martue様

    お忙しい中、どうもありがとうございます。
    的確なアドバイスに感謝申し上げます。

    ご提示いただいた参考URLを見ながら進めてみます。

    またお時間がある際に、お力添えの程、
    宜しくお願い致します。

    Honda

    (@rocketmartue)

    投稿を編集したら消えてしまいました。

    Honda

    (@rocketmartue)

    試してみたところ、
    [si_content name=スラッグ名]
    でしたら、問題なく表示されたのですが、
    id指定すると、何も表示がされませんでした。

    ショートコードの属性で、id を設定していないので何も表示されません。

    Honda

    (@rocketmartue)

    先日のコードには、余分なコードも含まれていましたので、中身を整理して id でも呼び出せるようにしました。

    // 固定ページの本文を呼び出す
    // [si_content name=スラッグ] または [si_content id=page_id]
    // [si_content name=スラッグ class=class_name] で class 名変更
    function page_func($atts) {
    	// ショートコードの属性
    	extract(shortcode_atts(array(
    		'id'        => '',
    		'name'      => '',
    		'post_type' => 'sample_item',
    		'class'     => 'post_content',
    		), $atts));
    
    	// WP_Query のパラメータ
    	$args = array(
    		'page_id'   => $id,
    		'name'      => $name,
    		'post_type' => $post_type,
    	);
    	$the_query = new WP_Query( $args );
    	while ( $the_query->have_posts() ) : $the_query->the_post();
    	$content = apply_filters( 'the_content', get_the_content() );
    	$content = str_replace( ']]>', ']]>', $content );
    	endwhile;
    	wp_reset_postdata();
    	return '<div class="'. $class.'">' . $content . '</div>';
    }
    add_shortcode( 'si_content', 'page_func', true );

    id で呼び出すためには、
    shortcode_atts に'id' => '',
    WP_Query のパラメータに'page_id' => $id,
    を追加する必要があります。
    また、スラッグか id のどちらかを指定するため、
    shortcode_atts の'name' => 'defalt'は、
    'name' => ''(デフォルトを空白)
    に変更しています。

    Honda

    (@rocketmartue)

    すみません。
    ‘sample_item’は、カスタム投稿タイプなので、page_id じゃなくて p ですね。

    // 固定ページの本文を呼び出す
    // [si_content name=スラッグ] または [si_content id=page_id]
    // [si_content name=スラッグ class=class_name] で class 名変更
    function page_func($atts) {
    	// ショートコードの属性
    	extract(shortcode_atts(array(
    		'id'        => '',
    		'name'      => '',
    		'class'     => 'post_content',
    		), $atts));
    
    	// WP_Query のパラメータ
    	$args = array(
    		'p'         => $id,
    		'name'      => $name,
    		'post_type' => 'sample_item',
    	);
    	$the_query = new WP_Query( $args );
    	while ( $the_query->have_posts() ) : $the_query->the_post();
    	$content = apply_filters( 'the_content', get_the_content() );
    	$content = str_replace( ']]>', ']]>', $content );
    	endwhile;
    	wp_reset_postdata();
    	return '<div class="'. $class.'">' . $content . '</div>';
    }
    add_shortcode( 'si_content', 'page_func', true );
    Tonokix

    (@magictoolpc)

    Rocket Martue様

    お忙しいなか詳しいご回答ありがとうございました。
    最後にいただいた内容で理想通りの挙動となりました。

    ご多忙にも関わらず的確なアドバイスに
    心より感謝申し上げます。。

    > カスタム投稿タイプなので、page_id じゃなくて p ですね。

    pという表記方法も初めて知りました。
    私自身ソースを追う力もまだまだ不足しておりますので

    今回のアドバイス内容を元に
    再度勉強をしたいと思います。

    プラグイン作りは奥が深いですね。

    また、質問をさせていただくこともあるかもしれませんが、
    その際はお力添えの程何卒宜しくお願い致します。

12件の返信を表示中 - 1 - 12件目 (全12件中)
  • トピック「カスタム投稿タイプでショートコードを発行するには?」には新たに返信することはできません。