カスタム投稿タイプのページタイトルを取得したドロップダウンを作リたいです。
-
初めましてこんにちは。
スライドjと申します。初めての質問をさせていただきます。
woocommerceのチェックアウトのページに動的なフォームを埋め込みたいです。
具体的には、portfolioというカスタム投稿タイプ(スラッグも同じ名前です)がございまして、そちらのすべてのページタイトルを取得したドロップダウンをwoocommerceのチェックアウトページにつけたいのですが、うまくいきません。海外のサイト等調べに調べ上げたのですが、不明なので、海外のサイトでも質問を試みました。
どのようなコードをfunction.phpに加えればよろしいのでしょうか。
どうぞご教授願います。宜しくお願い致します。woocommerceとワードプレスは最新版です。
-
このトピックは
slidejが8年前に変更しました。
-
このトピックは
-
woocommerceのチェックアウトのページというと、cart で良いとすれば、カスタム投稿タイプを表示させたいということでしょうか。
ショートコードで入れてみましたが、こういうこととは違うのですか。 http://wp.me/P1EfAD-oWお返事ありがとうございます。説明が悪かったみたいですみません。
カートに入れた後で、個人情報を入力するページがありますよね。(画像です。少しいじっていますが、一般的な入力事項の場合としてご回答いただければ幸いです。)
そこで、カスタム投稿タイプ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>'; }
お返事大変感謝申し上げます。ポートフォリオに表示させるものは、名刺デザインの例ではなく、名刺デザインをしてくれる人の名前に設定しているのですが、おっしゃる通りでございます。人の名前の一覧が出て、それが選択できるようになればいいと思っております。
-
この返信は8年前に
slidejが編集しました。
「名刺デザインのイメージ(必須項目) 」というのをカスタマイズで追加されているようですが、
これの応用で出来るのでは?
この部分は、どのようにカスタマイズされていますか?>>Du bist der Lenz様
お返事、親切にありがとうございます。すごい心強いです。ポートフォリオの投稿タイプに在籍デザイナーの作品が見えるようにを割り当てるつもりです。
で、その作品を見て注文すると言う流れなので、ポートフォリオの投稿タイプに対して、その人の名前がドロップダウンで選択できるようにすると言う仕様でございます。http://名刺デザイン.jp
http://名刺デザイン.jp/portfolio/-
この返信は8年前に
slidejが編集しました。
>>初めまして。RocketMartue様。
Woo Checkout Field Editor Proというプラグインで入力項目を変えております。
function.phpを触るのが面倒くさかったのでプラグインに頼ってますが、デフォルトの状態であったと仮定して話を進めていただいて構いません。なので、function.phpにコードを追加するのだろうと予想しています。-
この返信は8年前に
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/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様ここまで来るまでに至った皆様のお力添えに感謝します。ありがとうございます。
フォームが追加はできたもののデータをポストするときにエラーが出ます。
どのようなエラーが出ているのでしょうか?
内容が分からないとコメントのしようが無いと思うので、エラーの内容をアップしてください。RocketMartue様
1エラーのスクリーンショット
http://q2.upup.be/1XT4DJKmLf
こちらにエラーのスクリーンショットがあります。普通、入力の不備等があれば、入力に不備があります等のエラーメッセージが出ますが、文字がないエラーが出ます。手順通りに一応スクリーンショットをとりました。2
同時にクロームのコンソールを見るとFailed to load resource: the server responded with a status of 500 () https://xn--eck9awc8j315nbkc.jp/checkout/?wc-ajax=checkout
というようなエラーが出ます。
こちらは通常でないエラーでございます。
3また、注文をした場合ですが、正常に注文処理が完了してません。
ご厚意ありがとうございます。
参考にしたサイトの情報が古く、すでに存在しない関数を呼び出していたようです。
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; }
注文完了画面に選択されたポートフォリオのタイトルが表示されない気もしますが・・・
動きました。本当にありがとうございます!
管理画面には表示されているので、フィールドは機能していました!!
本当にありがとうございます。これが最後で、
注文完了画面と注文完了メールにもポートフォリオのタイトルが出るようにしたいです。
お客様への確認作業が必要なので追加したいのですが、下のコードを追加したら良さそうと海外の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 );
-
この返信は8年前に
- トピック「カスタム投稿タイプのページタイトルを取得したドロップダウンを作リたいです。」には新たに返信することはできません。