サポート » プラグイン » カスタム投稿タイプのページタイトルを取得したドロップダウンを作リたいです。

  • 初めましてこんにちは。
    スライドjと申します。

    初めての質問をさせていただきます。
    woocommerceのチェックアウトのページに動的なフォームを埋め込みたいです。
    具体的には、portfolioというカスタム投稿タイプ(スラッグも同じ名前です)がございまして、そちらのすべてのページタイトルを取得したドロップダウンをwoocommerceのチェックアウトページにつけたいのですが、うまくいきません。

    海外のサイト等調べに調べ上げたのですが、不明なので、海外のサイトでも質問を試みました。
    どのようなコードをfunction.phpに加えればよろしいのでしょうか。
    どうぞご教授願います。宜しくお願い致します。

    woocommerceとワードプレスは最新版です。

    • このトピックはslidejが7年、 2ヶ月前に変更しました。
15件の返信を表示中 - 1 - 15件目 (全18件中)
  • CG

    (@du-bist-der-lenz)

    woocommerceのチェックアウトのページというと、cart で良いとすれば、カスタム投稿タイプを表示させたいということでしょうか。
    ショートコードで入れてみましたが、こういうこととは違うのですか。 http://wp.me/P1EfAD-oW

    トピック投稿者 slidej

    (@slidej)

    お返事ありがとうございます。説明が悪かったみたいですみません。
    カートに入れた後で、個人情報を入力するページがありますよね。

    (画像です。少しいじっていますが、一般的な入力事項の場合としてご回答いただければ幸いです。)

    そこで、カスタム投稿タイプportfolioのページタイトル全てをドロップダウンリストに表示させたいと思っています。

    具体例は
    カスタム投稿タイプporfolioにA・B・C・Dの四つのページ(それぞれの投稿のタイトルはa・b・c・d)があったとした場合にドロップダウンにa・b・c・dが表示されて選択できるようにしようと思っています。

    webから見つけたのですが、下のコードをうまくつなぎ合わせる予感がしています。難しいです。

    1    ポートフォリオのタイトルを取得し表示するphp
    
    <?php $args = array(
            'numberposts' => 5,                //表示(取得)する記事の数
            'post_type' => ‘portfolio’    //投稿タイプの指定
        );
        $customPosts = get_posts($args);
        if($customPosts) : foreach($customPosts as $post) : setup_postdata( $post ); ?>
            <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
        <?php endforeach; ?>
        <?php else : //記事が無い場合 ?>
            <li><p>記事はまだありません。</p></li>
        <?php endif;
        wp_reset_postdata(); //クエリのリセット ?>
    
    2function.phpに記述しフィールドを加えるもの(ドロップダウンではありませんが)
    
    add_action( 'woocommerce_after_order_notes', 'my_custom_checkout_field' );
    function my_custom_checkout_field( $checkout ) {
    
        echo '<div id="my_custom_checkout_field"><h2>' . __('My Field') . '</h2>';
    
        woocommerce_form_field( 'my_field_name', array(
    
            'type'          => 'text',
    
            'class'         => array('my-field-class form-row-wide'),
    
            'label'         => __('Fill in this field'),
    
            'placeholder'   => __('Enter something'),
    
            ), $checkout->get_value( 'my_field_name' ));
    
        echo '</div>';
    
    }
    • この返信は7年、 2ヶ月前にslidejが編集しました。
    • この返信は7年、 2ヶ月前にslidejが編集しました。
    • この返信は7年、 2ヶ月前にslidejが編集しました。
    CG

    (@du-bist-der-lenz)

    『名刺デザイン』の例が、ポートフォリオにて作成されていて、アコーディオン方式で表示させたいということですね。

    トピック投稿者 slidej

    (@slidej)

    お返事大変感謝申し上げます。ポートフォリオに表示させるものは、名刺デザインの例ではなく、名刺デザインをしてくれる人の名前に設定しているのですが、おっしゃる通りでございます。人の名前の一覧が出て、それが選択できるようになればいいと思っております。

    • この返信は7年、 2ヶ月前にslidejが編集しました。
    CG

    (@du-bist-der-lenz)

    ポートフォリオを使ってというので、ややこしくなっているように思いますが、デザイナーを選択するということかしら

    Honda

    (@rocketmartue)

    「名刺デザインのイメージ(必須項目) 」というのをカスタマイズで追加されているようですが、
    これの応用で出来るのでは?
    この部分は、どのようにカスタマイズされていますか?

    トピック投稿者 slidej

    (@slidej)

    >>Du bist der Lenz様
    お返事、親切にありがとうございます。すごい心強いです。

    ポートフォリオの投稿タイプに在籍デザイナーの作品が見えるようにを割り当てるつもりです。
    で、その作品を見て注文すると言う流れなので、ポートフォリオの投稿タイプに対して、その人の名前がドロップダウンで選択できるようにすると言う仕様でございます。

    http://名刺デザイン.jp
    http://名刺デザイン.jp/portfolio/

    • この返信は7年、 2ヶ月前にslidejが編集しました。
    トピック投稿者 slidej

    (@slidej)

    >>初めまして。RocketMartue様。
    Woo Checkout Field Editor Proというプラグインで入力項目を変えております。
    function.phpを触るのが面倒くさかったのでプラグインに頼ってますが、デフォルトの状態であったと仮定して話を進めていただいて構いません。なので、function.phpにコードを追加するのだろうと予想しています。

    • この返信は7年、 2ヶ月前にslidejが編集しました。

    こんにちは

    私はwoocommerceを使ったことがありませんが、以下のコードで投稿タイプporfolioのタイトルを選択肢として表示できるところまでは確認できています。
    構文エラーはない模様です。
    保存の処理なんかも記載していますが、正しく動くかどうか分かりません。
    申し訳ありませんが、動かなくても質問は受け付けられませんので、参考程度にしてください。

    /* ポートフォリオ選択肢の表示 */
    add_action( 'woocommerce_after_order_notes', 'my_custom_checkout_field' );
    function my_custom_checkout_field( $checkout ) {
    
    	echo '<div id="porfolio_title_field"';
    	
        woocommerce_form_field('porfolio_title', array(
            	'type' => 'select',
            	'label' => 'ポートフォリオタイトル',
            	'options' => get_porfolio()
    		),
    		$checkout->get_value( 'porfolio_title' )
    		
    	);
    
    	echo '</div>';
    }
    
    /* ポートフォリオの選択チェック */
    add_action('woocommerce_checkout_process', 'my_custom_checkout_field_process');
    function my_custom_checkout_field_process() {
        global $woocommerce;
        if (isset($_POST['porfolio_title']) &&  !empty($_POST['porfolio_title'])) {
        	$woocommerce->add_error( __('ポートフォリオのタイトルを選択してください。') );
        }
    }
    
    /* 選択されているポートフォリオタイトルを保存 */
    add_action('woocommerce_checkout_update_order_meta', 'my_custom_checkout_field_update_order_meta');
    function my_custom_checkout_field_update_order_meta( $order_id ) {
    	if ($_POST['porfolio_title']) update_post_meta( $order_id, 'porfolio_title', esc_attr($_POST['porfolio_title']));
    }
    
    /* 購入されたポートフォリオタイトルを表示 */
    add_action( 'woocommerce_admin_order_data_after_billing_address', 'my_custom_checkout_field_display_admin_order_meta', 10, 1 );
    function my_custom_checkout_field_display_admin_order_meta($order){
         echo '<p><strong>ポートフォリオタイトル:</strong> ' . $order->order_custom_fields['porfolio_title'][0] . '</p>';
    }
    
    /* ポートフォリオ選択肢の生成 */
    function get_porfolio(){
    	$porfolio = array('' => '');
    	$args = array(
    		'post_type' => 'porfolio',
    		'numberposts' => 0
    	);
    	$posts_array = get_posts( $args );
    	$size = count( $posts_array );
    	for( $i=0 ; $i < $size ; $i++ ){
    		$porfolio += array($posts_array[$i]->post_title => $posts_array[$i]->post_title);
    	}
    	wp_reset_postdata();
    	
    	return $porfolio;
    }

    参考:
    http://stackoverflow.com/questions/22826098/woocommerce-functions-for-dropdown-boxes
    https://www.cloudways.com/blog/custom-field-woocommerce-checkout-page/

    トピック投稿者 slidej

    (@slidej)

    munyagu様

    /* ポートフォリオ選択肢の表示 */
    add_action( 'woocommerce_after_order_notes', 'my_custom_checkout_field' );
    function my_custom_checkout_field( $checkout ) {
    
    	echo '<div id="porfolio_title_field"';
    	
        woocommerce_form_field('porfolio_title', array(
            	'type' => 'select',
            	'label' => 'ポートフォリオタイトル',
            	'options' => get_porfolio()
    		),
    		$checkout->get_value( 'porfolio_title' )
    		
    	);
    
    	echo '</div>';
    }
    
    /* ポートフォリオの選択チェック */
    add_action('woocommerce_checkout_process', 'my_custom_checkout_field_process');
    function my_custom_checkout_field_process() {
        global $woocommerce;
        if (isset($_POST['porfolio_title']) &&  !empty($_POST['porfolio_title'])) {
        	$woocommerce->add_error( __('ポートフォリオのタイトルを選択してください。') );
        }
    }
    
    /* 選択されているポートフォリオタイトルを保存 */
    add_action('woocommerce_checkout_update_order_meta', 'my_custom_checkout_field_update_order_meta');
    function my_custom_checkout_field_update_order_meta( $order_id ) {
    	if ($_POST['porfolio_title']) update_post_meta( $order_id, 'porfolio_title', esc_attr($_POST['porfolio_title']));
    }
    
    /* 購入されたポートフォリオタイトルを表示 */
    add_action( 'woocommerce_admin_order_data_after_billing_address', 'my_custom_checkout_field_display_admin_order_meta', 10, 1 );
    function my_custom_checkout_field_display_admin_order_meta($order){
         echo '<p><strong>ポートフォリオタイトル:</strong> ' . $order->order_custom_fields['porfolio_title'][0] . '</p>';
    }
    
    /* ポートフォリオ選択肢の生成 */
    function get_porfolio(){
    	$porfolio = array('' => '');
    	$args = array(
    		'post_type' => 'portfolio',
    		'numberposts' => 0
    	);
    	$posts_array = get_posts( $args );
    	$size = count( $posts_array );
    	for( $i=0 ; $i < $size ; $i++ ){
    		$porfolio += array($posts_array[$i]->post_title => $posts_array[$i]->post_title);
    	}
    	wp_reset_postdata();
    	
    	return $porfolio;
    }

    で取得する投稿タイプをporfolioからportfolioに変更したら動きました!!!!!
    なお、他の関数は$porfolioはおそらく他のプラグイン等でも使ってないと思うのでエラーが出ないで済みました。

    >>RocketMartue様
    >>Du bist der Lenz様

    ここまで来るまでに至った皆様のお力添えに感謝します。ありがとうございます。

    トピック投稿者 slidej

    (@slidej)

    なんども失礼してしております。フォームが追加はできたもののデータをポストするときにエラーが出ます。

    エラーを探るべく少し研究してみようかなと思いますが、再び情報を共有させてくださいませ。
    失礼しております。

    • この返信は7年、 2ヶ月前にslidejが編集しました。
    • この返信は7年、 2ヶ月前にslidejが編集しました。
    Honda

    (@rocketmartue)

    フォームが追加はできたもののデータをポストするときにエラーが出ます。

    どのようなエラーが出ているのでしょうか?
    内容が分からないとコメントのしようが無いと思うので、エラーの内容をアップしてください。

    トピック投稿者 slidej

    (@slidej)

    RocketMartue様

    1エラーのスクリーンショット
    http://q2.upup.be/1XT4DJKmLf
    こちらにエラーのスクリーンショットがあります。普通、入力の不備等があれば、入力に不備があります等のエラーメッセージが出ますが、文字がないエラーが出ます。手順通りに一応スクリーンショットをとりました。


    同時にクロームのコンソールを見ると

    Failed to load resource: the server responded with a status of 500 () https://xn--eck9awc8j315nbkc.jp/checkout/?wc-ajax=checkout

    というようなエラーが出ます。

    こちらは通常でないエラーでございます。

    3また、注文をした場合ですが、正常に注文処理が完了してません。

    ご厚意ありがとうございます。

    • この返信は7年、 2ヶ月前にslidejが編集しました。
    • この返信は7年、 2ヶ月前にslidejが編集しました。

    参考にしたサイトの情報が古く、すでに存在しない関数を呼び出していたようです。
    portfolioのスペルミスも含めて修正してみました。

    /* ポートフォリオ選択肢の表示 */
    add_action( 'woocommerce_after_order_notes', 'my_custom_checkout_field' );
    function my_custom_checkout_field( $checkout ) {
    
    	echo '<div id="portfolio_title_field"';
    	
        woocommerce_form_field('portfolio_title', array(
            	'type' => 'select',
            	'label' => 'ポートフォリオタイトル',
            	'options' => get_portfolio()
    		),
    		$checkout->get_value( 'portfolio_title' )
    		
    	);
    
    	echo '</div>';
    }
    
    /* ポートフォリオの選択チェック */
    add_action('woocommerce_checkout_process', 'my_custom_checkout_field_process');
    function my_custom_checkout_field_process() {
        global $woocommerce;
        if (!isset($_POST['portfolio_title']) ||  empty($_POST['portfolio_title'])) {
        	wc_add_notice('ポートフォリオのタイトルを選択してください。', 'error');
        }
    }
    
    /* 選択されているポートフォリオタイトルを保存 */
    add_action('woocommerce_checkout_update_order_meta', 'my_custom_checkout_field_update_order_meta');
    function my_custom_checkout_field_update_order_meta( $order_id ) {
    	if ($_POST['portfolio_title']) update_post_meta( $order_id, 'portfolio_title', esc_attr($_POST['portfolio_title']));
    }
    
    /* 購入されたポートフォリオタイトルを表示 */
    add_action( 'woocommerce_admin_order_data_after_billing_address', 'my_custom_checkout_field_display_admin_order_meta', 10, 1 );
    function my_custom_checkout_field_display_admin_order_meta($order){
         echo '<p><strong>ポートフォリオタイトル:</strong> ' . get_post_meta($order->post->ID, 'portfolio_title', true) . '</p>';
    }
    
    /* ポートフォリオ選択肢の生成 */
    function get_portfolio(){
    	$portfolio = array('' => '');
    	$args = array(
    		'post_type' => 'portfolio',
    		'numberposts' => 0
    	);
    	$posts_array = get_posts( $args );
    	$size = count( $posts_array );
    	for( $i=0 ; $i < $size ; $i++ ){
    		$portfolio += array($posts_array[$i]->post_title => $posts_array[$i]->post_title);
    	}
    	wp_reset_postdata();
    	
    	return $portfolio;
    }

    注文完了画面に選択されたポートフォリオのタイトルが表示されない気もしますが・・・

    トピック投稿者 slidej

    (@slidej)

    動きました。本当にありがとうございます!
    管理画面には表示されているので、フィールドは機能していました!!
    本当にありがとうございます。

    これが最後で、
    注文完了画面と注文完了メールにもポートフォリオのタイトルが出るようにしたいです。
    お客様への確認作業が必要なので追加したいのですが、下のコードを追加したら良さそうと海外のHPのソースを見てたのですが、どう思いますでしょうか。

    /**
     * Add the fields to order emails
     **/
    add_action( "woocommerce_email_after_order_table", "my_woocommerce_email_after_order_table", 10, 1);
    
    /* ADD THE SAME FUNCTION AGAIN TO RUN ON THANK YOU PAGE */
    add_action( 'woocommerce_order_details_after_order_table', "my_woocommerce_email_after_order_table", 10, 1 );
15件の返信を表示中 - 1 - 15件目 (全18件中)
  • トピック「カスタム投稿タイプのページタイトルを取得したドロップダウンを作リたいです。」には新たに返信することはできません。