カスタム投稿タイプのページタイトルを取得したドロップダウンを作リたいです。
-
初めましてこんにちは。
スライドjと申します。初めての質問をさせていただきます。
woocommerceのチェックアウトのページに動的なフォームを埋め込みたいです。
具体的には、portfolioというカスタム投稿タイプ(スラッグも同じ名前です)がございまして、そちらのすべてのページタイトルを取得したドロップダウンをwoocommerceのチェックアウトページにつけたいのですが、うまくいきません。海外のサイト等調べに調べ上げたのですが、不明なので、海外のサイトでも質問を試みました。
どのようなコードをfunction.phpに加えればよろしいのでしょうか。
どうぞご教授願います。宜しくお願い致します。woocommerceとワードプレスは最新版です。
-
このトピックは
slidejが4年前に変更しました。
-
このトピックは
-
<?php function dequeue_devicepx() { wp_dequeue_script( 'devicepx' ); } add_action( 'wp_enqueue_scripts', 'dequeue_devicepx', 20 ); add_action('init','add_categories_for_pages'); function add_categories_for_pages(){ register_taxonomy_for_object_type('category', 'page'); } add_action( 'pre_get_posts', 'nobita_merge_page_categories_at_category_archive' ); function nobita_merge_page_categories_at_category_archive( $query ) { if ( $query->is_category== true && $query->is_main_query() ) { $query->set('post_type', array( 'post', 'page', 'nav_menu_item')); } } add_filter( 'arexworks_get_global_loop_variable', 'harman_set_global_loop_variable' ); if(!function_exists('harman_set_global_loop_variable')){ function harman_set_global_loop_variable(){ return 'harman_loop'; } } /* * Load Frameworks */ require_once get_template_directory() . '/framework/load.php'; /** * Theme support & Theme setup */ if ( ! isset( $content_width ) ) { $content_width = 1170; } add_action('after_setup_theme', 'harman_after_setup_theme'); if(!function_exists('harman_after_setup_theme')){ function harman_after_setup_theme(){ /** * Load Text domain */ load_theme_textdomain( 'harman', get_template_directory() . '/languages' ); load_child_theme_textdomain( 'harman', get_stylesheet_directory() . '/languages' ); /** * Add theme support */ add_theme_support( 'woocommerce'); if(defined('WOOCOMMERCE_VERSION')){ if(version_compare( WOOCOMMERCE_VERSION, "2.1" ) >= 0){ add_filter( 'woocommerce_enqueue_styles', '__return_empty_array' ); } else { define( 'WOOCOMMERCE_USE_CSS', false ); } } add_theme_support( 'automatic-feed-links' ); add_theme_support( 'title-tag' ); add_theme_support( 'custom-header' ); add_theme_support( 'custom-background' ); add_theme_support( 'post-thumbnails' ); add_theme_support( 'post-formats', array( 'quote', 'image', 'video', 'link', 'audio', 'gallery' ) ); add_theme_support( 'menus' ); register_nav_menus( array( 'account-nav' => esc_attr__( 'Account Navigation', 'harman' ), 'main-nav' => esc_attr__( 'Main Navigation', 'harman' ), ) ); add_editor_style( 'editor-style.css' ); } } add_filter('harman_filter_show_page_title', '__return_false'); function section_feed_shortcode( $atts ) { extract( shortcode_atts( array( 'limit' => -1, 'type' => 'post'), $atts ) ); $paged = get_query_var('paged') ? get_query_var('paged') : 1; query_posts( array ( 'posts_per_page' => $limit, 'post_type' => $type, 'order' => 'ASC', 'orderby' =>'menu_order', 'paged' => $paged ) ); $list = ' '; while ( have_posts() ) { the_post(); $list .= '<article class="listing-view clearfix">' . '<div class="listing-content">' . '<h3><a href="' . get_permalink() . '">' . get_the_title() . '</a></h3>' .'<p>' . get_the_excerpt() . '</p>' . '<a href="' . get_permalink() . '">' . '続きを読む »' . '</a>' . '</div>' . '<a class="listing-thumb" href="' . get_permalink() . '">' . get_the_post_thumbnail($page->ID, 'listing-thumb') . '<span></span></a>' . '</article>'; } return '<div class="listings clearfix">' . $list . '<div class="nav-previous">' . get_next_posts_link( __( '<span class="meta-nav">←</span> Older posts' ) ) . '</div>' . '<div class="nav-next">' . get_previous_posts_link( __( 'Newer posts <span class="meta-nav">→</span>' ) ) . '</div>' . '</div>' . wp_reset_query(); } add_shortcode( 'feed', 'section_feed_shortcode' ); /* ポートフォリオ選択肢の表示 */ 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>'; } /* メールに追加 */ add_filter( 'woocommerce_email_order_meta_fields', 'custom_woocommerce_email_order_meta_fields', 10, 3 ); function custom_woocommerce_email_order_meta_fields( $fields, $sent_to_admin, $order ) { $fields['meta_key'] = array( 'label' => __( 'ご依頼のデザイナー' ), 'value' => get_post_meta($order->post->ID, 'portfolio_title', true), ); return $fields; } /* ポートフォリオ選択肢の生成 */ 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; }
適当にやって見たのですが、メールの画面に関しては
/* メールに追加 */ add_filter( 'woocommerce_email_order_meta_fields', 'custom_woocommerce_email_order_meta_fields', 10, 3 ); function custom_woocommerce_email_order_meta_fields( $fields, $sent_to_admin, $order ) { $fields['meta_key'] = array( 'label' => __( 'ご依頼のデザイナー' ), 'value' => get_post_meta($order->post->ID, 'portfolio_title', true), ); return $fields; }
で追加することはできました。
解決されたみたいですね。
WooCommerce 公式のドキュメント
https://docs.woocommerce.com/document/tutorial-customising-checkout-fields-using-actions-and-filters/
を元にコードを書いてみましたので、一応あげておきます。/* ポートフォリオ選択肢の生成 */ function get_portfolio(){ $portfolio = array('' => ''); $args = array( 'post_type' => 'post', '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; } /* ポートフォリオ選択肢をチェックアウトにフィールドを追加する */ 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', 'required' => true, 'class' => array('form-row-wide notes woocommerce-validated'), 'clear' => true, '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() { //設定されていない場合はエラーを追加します。 if ( ! $_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 ( ! empty( $_POST['portfolio_title'] ) ) { update_post_meta( $order_id, 'portfolio_title', sanitize_text_field( $_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->id, 'ご依頼のデザイナー', true ) . '</p>'; } /* メールにカスタムフィールドを追加する */ add_filter('woocommerce_email_order_meta_keys', 'my_custom_order_meta_keys'); function my_custom_order_meta_keys( $keys ) { $keys[] = 'ご依頼のデザイナー'; //'ご依頼のデザイナー'というカスタムフィールドを探し、電子メールに追加します return $keys; }
メールについては、slidej さんのコードの方が応用がききそうですね。
- トピック「カスタム投稿タイプのページタイトルを取得したドロップダウンを作リたいです。」には新たに返信することはできません。