Support » WooCommerce » Coupon Discount in Order anzeigen

  • Adrian

    (@adrianlacheta)


    Hallo,

    wie kann ich mir den genauen Discount ausgeben lassen, den jeder einzelne Coupon in einer Order erzeugt hat? (Im WooCommerce Backend wird dieser Betrag als ToolTip angezeigt, wenn man in einer Order über den verwendeten Coupon Code hovert)

    Mit dem folgenden Code kann ich mir nur die verwendeten Coupon Codes einer Bestellung anzeigen lassen:

    $order = wc_get_order($order_id);
    foreach($order->get_coupon_codes() as $coupon_code) {
    echo $coupon_code;
    }

    Um den aktuellen Coupon-Betrag zu erhalten kann ich jetzt folgendes machen:

    $coupon = new WC_Coupon($coupon_code);
    $coupon_amount = $coupon->get_amount();

    Mein Problem ist aber, dass ich nicht den aktuellen Wert des Gutscheins bekommen möchte, sondern den genauen Discount den der coupon bei erzeugen der Bestellung ausgelöst hat.

    • Dieses Thema wurde geändert vor 2 Wochen, 3 Tage von Adrian.
    • Dieses Thema wurde geändert vor 2 Wochen, 3 Tage von Adrian.
    • Dieses Thema wurde geändert vor 2 Wochen, 3 Tage von Adrian.
Ansicht von 4 Antworten - 1 bis 4 (von insgesamt 4)
  • Habe mich bisher nicht groß mit Coupons in Woo beschäftigt. Aber vielleicht hilft dir folgender Codeschnipsel

    $coupons = $order->get_items( 'coupon' );
    	if ( $coupons ) :
    		?>
    		<div class="wc-used-coupons">
    			<ul class="wc_coupon_list">
    				<li><strong><?php esc_html_e( 'Coupon(s)', 'woocommerce' ); ?></strong></li>
    				<?php
    				foreach ( $coupons as $item_id => $item ) :
    					$post_id = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM {$wpdb->posts} WHERE post_title = %s AND post_type = 'shop_coupon' AND post_status = 'publish' LIMIT 1;", $item->get_code() ) ); // phpcs:disable WordPress.WP.GlobalVariablesOverride.Prohibited
    					$class   = $order->is_editable() ? 'code editable' : 'code';
    					?>
    					<li class="<?php echo esc_attr( $class ); ?>">
    						<?php if ( $post_id ) : ?>
    							<?php
    							$post_url = apply_filters(
    								'woocommerce_admin_order_item_coupon_url',
    								add_query_arg(
    									array(
    										'post'   => $post_id,
    										'action' => 'edit',
    									),
    									admin_url( 'post.php' )
    								),
    								$item,
    								$order
    							);
    							?>
    							<a href="<?php echo esc_url( $post_url ); ?>" class="tips" data-tip="<?php echo esc_attr( wc_price( $item->get_discount(), array( 'currency' => $order->get_currency() ) ) ); ?>">
    								<span><?php echo esc_html( $item->get_code() ); ?></span>
    							</a>
    						<?php else : ?>
    							<span class="tips" data-tip="<?php echo esc_attr( wc_price( $item->get_discount(), array( 'currency' => $order->get_currency() ) ) ); ?>">
    								<span><?php echo esc_html( $item->get_code() ); ?></span>
    							</span>
    						<?php endif; ?>
    						<?php if ( $order->is_editable() ) : ?>
    							<a class="remove-coupon" href="javascript:void(0)" aria-label="Remove" data-code="<?php echo esc_attr( $item->get_code() ); ?>"></a>
    						<?php endif; ?>
    					</li>
    				<?php endforeach; ?>
    			</ul>
    		</div>
    	<?php endif; 

    Gut möglich, dass dies der Teil ist, den du mit den Tooltips meintest.
    Gefunden in plugins\woocommerce\includes\admin\meta-boxes\views\html-order-items.php

    Thread-Ersteller Adrian

    (@adrianlacheta)

    Hi Michi,

    dank dir, das ist exakt die Stelle und im Backend wird der richtige discount angezeigt. Aber wenn ich versuche daraus einen eigenen WP_Query zu machen, dann ist der discount amount immer bei 0,00 €. Ich hab den Code etwas abgeändert, damit der ToolTip einfach ausgegeben wird.

    $loop = new WP_Query( array(
    	'post_type'         => 'shop_order',
    	'post_status'       =>  array( 'wc-processing','wc-completed' ),
    	'posts_per_page'    => -1,
    	'fields' 			=> 'ids',
    ));
    
    if ( $loop->have_posts() ):
    while ( $loop->have_posts() ) : $loop->the_post();
    	
    	$order_id = get_the_ID();
    	$order = wc_get_order($order_id);
    
    	$coupons = $order->get_items( 'coupon' );
    	if ( $coupons ) :
    		?>
    		<div class="wc-used-coupons">
    			<ul class="wc_coupon_list">
    				<li><strong><?php esc_html_e( 'Coupon(s)', 'woocommerce' ); ?></strong></li>
    				<?php
    				foreach ( $coupons as $item_id => $item ) :
    					$post_id = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM {$wpdb->posts} WHERE post_title = %s AND post_type = 'shop_coupon' AND post_status = 'publish' LIMIT 1;", $item->get_code() ) ); // phpcs:disable WordPress.WP.GlobalVariablesOverride.Prohibited
    					$class   = $order->is_editable() ? 'code editable' : 'code';
    					?>
    					<li class="<?php echo esc_attr( $class ); ?>">
    						<?php if ( $post_id ) : ?>
    							<?php
    							$post_url = apply_filters(
    								'woocommerce_admin_order_item_coupon_url',
    								add_query_arg(
    									array(
    										'post'   => $post_id,
    										'action' => 'edit',
    									),
    									admin_url( 'post.php' )
    								),
    								$item,
    								$order
    							);
    							?>
    							<a href="<?php echo esc_url( $post_url ); ?>" class="tips" data-tip="<?php echo esc_attr( wc_price( $item->get_discount(), array( 'currency' => $order->get_currency() ) ) ); ?>">
    								<span><?php echo esc_html( $item->get_code() ); ?></span>
    							</a>
    							<br>
    							<?php echo wc_price( $item->get_discount(), array( 'currency' => $order->get_currency() ) ); ?>
    						<?php else : ?>
    							<span class="tips" data-tip="<?php echo esc_attr( wc_price( $item->get_discount(), array( 'currency' => $order->get_currency() ) ) ); ?>">
    								<span><?php echo esc_html( $item->get_code() ); ?></span>
    							</span>
    						<?php endif; ?>
    						<?php if ( $order->is_editable() ) : ?>
    							<a class="remove-coupon" href="javascript:void(0)" aria-label="Remove" data-code="<?php echo esc_attr( $item->get_code() ); ?>"></a>
    						<?php endif; ?>
    					</li>
    				<?php endforeach; ?>
    			</ul>
    		</div>
    	<?php endif; 
    
    	
    	
    	
    endwhile;
    wp_reset_postdata();
    endif;

    Das ist meine Ausgabe:

    Coupon(s)
    a76c7775a918352efa
    0,00 €
    Coupon(s)
    4161576ecec13a2814
    0,00 €
    Coupon(s)
    a76c7775a918352efa
    0,00 €
    Coupon(s)
    vipdrink2022
    0,00 €
    4161576ecec13a2814
    0,00 €
    • Diese Antwort wurde geändert vor 2 Wochen, 3 Tage von Adrian.
    Thread-Ersteller Adrian

    (@adrianlacheta)

    Ich habe das Experiment jetzt sogar noch drastisch verkleinert. Ich habe in meiner WordPress Installation das Template auf das Standart Template „twentytwentytwo“ umgestellt und hier nur diese eine zusätzliche Template Datei ins Root-Verzeichnis reinkopiert. Um die Installation so clean wie möglich zu bekommen habe ich alle Plugins bis auf WooCommerce deaktiviert.

    Ich verstehe nicht, wieso der Discount immer mit 0,00 € angezeigt wird. Ich vermute, dass das ein WordPress Bug sein könnte.

    <?php
    /*
    Template Name: Gutscheine Übersicht
    */
    get_header();
    
    if (have_posts()):
    while (have_posts()) : the_post();
    ?>
    
    	<h1>Genutzte Gutscheine</h1>
    	
    	<?php		
    	$loop = new WP_Query( array(
    		'post_type'         => 'shop_order',
    		'post_status'       =>  array( 'wc-processing','wc-completed' ),
    		'posts_per_page'    => -1,
    		'fields' 			=> 'ids',
    	));
    	
    	if ( $loop->have_posts() ):
    	while ( $loop->have_posts() ) : $loop->the_post();
    		
    		$order_id = get_the_ID();
    		$order = wc_get_order($order_id);
    
    		$coupons = $order->get_items( 'coupon' );
    		if ( $coupons ) :
    			?>
    			<div class="wc-used-coupons">
    				<ul class="wc_coupon_list">
    					<li><strong><?php esc_html_e( 'Coupon(s)', 'woocommerce' ); ?></strong></li>
    					<?php
    					foreach ( $coupons as $item_id => $item ) :
    						$post_id = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM {$wpdb->posts} WHERE post_title = %s AND post_type = 'shop_coupon' AND post_status = 'publish' LIMIT 1;", $item->get_code() ) ); // phpcs:disable WordPress.WP.GlobalVariablesOverride.Prohibited
    						$class   = $order->is_editable() ? 'code editable' : 'code';
    						?>
    						<li class="<?php echo esc_attr( $class ); ?>">
    							<?php if ( $post_id ) : ?>
    								<?php
    								$post_url = apply_filters(
    									'woocommerce_admin_order_item_coupon_url',
    									add_query_arg(
    										array(
    											'post'   => $post_id,
    											'action' => 'edit',
    										),
    										admin_url( 'post.php' )
    									),
    									$item,
    									$order
    								);
    								?>
    								<a href="<?php echo esc_url( $post_url ); ?>" class="tips" data-tip="<?php echo esc_attr( wc_price( $item->get_discount(), array( 'currency' => $order->get_currency() ) ) ); ?>">
    									<span><?php echo esc_html( $item->get_code() ); ?></span>
    								</a>
    								<br>
    								<?php echo wc_price( $item->get_discount(), array( 'currency' => $order->get_currency() ) ); ?>
    							<?php else : ?>
    								<span class="tips" data-tip="<?php echo esc_attr( wc_price( $item->get_discount(), array( 'currency' => $order->get_currency() ) ) ); ?>">
    									<span><?php echo esc_html( $item->get_code() ); ?></span>
    								</span>
    							<?php endif; ?>
    							<?php if ( $order->is_editable() ) : ?>
    								<a class="remove-coupon" href="javascript:void(0)" aria-label="Remove" data-code="<?php echo esc_attr( $item->get_code() ); ?>"></a>
    							<?php endif; ?>
    						</li>
    					<?php endforeach; ?>
    				</ul>
    			</div>
    		<?php endif;
    	endwhile;
    	wp_reset_postdata();
    	endif;
    	
    endwhile;
    endif;
    get_footer();
    ?>

    Das ist meine Ausgabe:

    Coupon(s)
    a76c7775a918352efa
    0,00 €
    Coupon(s)
    4161576ecec13a2814
    0,00 €
    Coupon(s)
    a76c7775a918352efa
    0,00 €
    Coupon(s)
    vipdrink2022
    0,00 €
    4161576ecec13a2814
    0,00 €

    Oben fehlt ein global $wpdb; damit wpdb auch benutzt werden kann.

    Desweiteren solltest du mal wp debug und wp debug display aktivieren, in der Ausgabe müsste dann ja mehr zu finden sein.

    Ausserdem würde ich mir noch mehr debug Informationen ausgeben lassen wie z. B. Die order id oder ein var dump von $item

Ansicht von 4 Antworten - 1 bis 4 (von insgesamt 4)