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

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

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

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

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

    • このトピックはslidejが3年、 6ヶ月前に変更しました。
3件の返信を表示中 - 16 - 18件目 (全18件中)
  • <?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() . '">' . '続きを読む &raquo;' . '</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">&larr;</span> Older posts' ) ) . '</div>'
    . '<div class="nav-next">' . get_previous_posts_link( __( 'Newer posts <span class="meta-nav">&rarr;</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;
    }
    

    で追加することはできました。

    Honda

    (@rocketmartue)

    解決されたみたいですね。

    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 さんのコードの方が応用がききそうですね。

3件の返信を表示中 - 16 - 18件目 (全18件中)
  • トピック「カスタム投稿タイプのページタイトルを取得したドロップダウンを作リたいです。」には新たに返信することはできません。