• Resolved dansperfect

    (@dansperfect)


    My code is:

        <div><?php
            $strpTotal = $total['value'];
            $totalVal = trim($strpTotal, "$");
            if ( $totalVal < 100 ){
                            echo 'My Text';} ?>
                            <br />
             <?php          echo  "totalVal: " . $totalVal;
                    ?></div>

    So adding this to a normal php file uploading it to a server and definning $total works fine. So I add this same code to email-order-details.php for woocommerce to include my echoed text when order is less than 100. I test this with an order less than 100 and over 100 and the text gets echoed regardless of the total and the $totalVal still echoes the total value of the order with the $. I can see this making the if script fail and not echoing but regardless it still echoes in the email. I have tried str_replace, ltrim, chop and nothing removes the $ from the total amount.

    The total code of the file:

    <?php
    /**
     * Order details table shown in emails.
     *
     * This template can be overridden by copying it to yourtheme/woocommerce/emails/email-order-details.php.
     *
     * HOWEVER, on occasion WooCommerce will need to update template files and you
     * (the theme developer) will need to copy the new files to your theme to
     * maintain compatibility. We try to do this as little as possible, but it does
     * happen. When this occurs the version of the template file will be bumped and
     * the readme will list any important changes.
     *
     * @see https://docs.woocommerce.com/document/template-structure/
     * @package WooCommerce/Templates/Emails
     * @version 3.3.1
     */
    
    if ( ! defined( 'ABSPATH' ) ) {
    	exit;
    }
    
    $text_align = is_rtl() ? 'right' : 'left';
    
    do_action( 'woocommerce_email_before_order_table', $order, $sent_to_admin, $plain_text, $email ); ?>
    
    <h2>
    	<?php
    	if ( $sent_to_admin ) {
    		$before = '<a class="link" href="' . esc_url( $order->get_edit_order_url() ) . '">';
    		$after  = '</a>';
    	} else {
    		$before = '';
    		$after  = '';
    	}
    	/* translators: %s: Order ID. */
    	echo wp_kses_post( $before . sprintf( __( '[Order #%s]', 'woocommerce' ) . $after . ' (<time datetime="%s">%s</time>)', $order->get_order_number(), $order->get_date_created()->format( 'c' ), wc_format_datetime( $order->get_date_created() ) ) );
    	?>
    </h2>
    
    <div style="margin-bottom: 40px;">
    	<table class="td" cellspacing="0" cellpadding="6" style="width: 100%; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif;" border="1">
    		<thead>
    			<tr>
    				<th class="td" scope="col" style="text-align:<?php echo esc_attr( $text_align ); ?>;"><?php esc_html_e( 'Product', 'woocommerce' ); ?></th>
    				<th class="td" scope="col" style="text-align:<?php echo esc_attr( $text_align ); ?>;"><?php esc_html_e( 'Quantity', 'woocommerce' ); ?></th>
    				<th class="td" scope="col" style="text-align:<?php echo esc_attr( $text_align ); ?>;"><?php esc_html_e( 'Price', 'woocommerce' ); ?></th>
    			</tr>
    		</thead>
    		<tbody>
    			<?php
    			echo wc_get_email_order_items( $order, array( // WPCS: XSS ok.
    				'show_sku'      => $sent_to_admin,
    				'show_image'    => false,
    				'image_size'    => array( 32, 32 ),
    				'plain_text'    => $plain_text,
    				'sent_to_admin' => $sent_to_admin,
    			) );
    			?>
    		</tbody>
    		<tfoot>
    			<?php
    			$totals = $order->get_order_item_totals();
    
    			if ( $totals ) {
    				$i = 0;
    				foreach ( $totals as $total ) {
    					$i++;
    					?>
    					<tr>
    						<th class="td" scope="row" colspan="2" style="text-align:<?php echo esc_attr( $text_align ); ?>; <?php echo ( 1 === $i ) ? 'border-top-width: 4px;' : ''; ?>"><?php echo wp_kses_post( $total['label'] ); ?></th>
    						<td class="td" style="text-align:<?php echo esc_attr( $text_align ); ?>; <?php echo ( 1 === $i ) ? 'border-top-width: 4px;' : ''; ?>"><?php echo wp_kses_post( $total['value'] ); ?></td>
    					</tr>
    					<?php
    				}
    			}
    			if ( $order->get_customer_note() ) {
    				?>
                
    				<tr>
    					<th class="td" scope="row" colspan="2" style="text-align:<?php echo esc_attr( $text_align ); ?>;"><?php esc_html_e( 'Note:', 'woocommerce' ); ?></th>
    					<td class="td" style="text-align:<?php echo esc_attr( $text_align ); ?>;"><?php echo wp_kses_post( wptexturize( $order->get_customer_note() ) ); ?></td>
    				</tr>
    				<?php
    			}
    			?>
    		</tfoot>
    	</table>
        <div><?php
            $strpTotal = $total['value'];
            $totalVal = trim($strpTotal, "$");
            if ( $totalVal < 100 ){
                            echo 'My Text';} ?>
                            <br />
             <?php          echo  "totalVal: " . $totalVal;
                    ?></div>
    
    </div>
    
    <?php do_action( 'woocommerce_email_after_order_table', $order, $sent_to_admin, $plain_text, $email ); ?>
    
Viewing 6 replies - 1 through 6 (of 6 total)
  • So adding this to a normal php file uploading it to a server and defining $total works fine

    What are you defining $total to?

    Do you have a $ in front of it?

    Is it actually

    & # 0 3 6 ;

    (no spaces) (in woo) ?

    Thread Starter dansperfect

    (@dansperfect)

    $total is defined by woocommerce in the order details of the Email Templates Order Detail Templates for my Account. The $total is the variable given by woocommerce for the Total amount on all these pages. So I used this to establish the variable. But when you just echo it to the page it’s already formatted with the $.

    Suggest that you put:
    print_r( $total);
    Into your code to see what it really is + what else it offers.

    Thread Starter dansperfect

    (@dansperfect)

    $total only has a label with the text Total and a value with the total value added up from $totals which is an array of all the products prices which are then added togeteher and spit out as $total.

    Thread Starter dansperfect

    (@dansperfect)

    the fix to the problem is:

    preg_replace(“/$/”, ”, $strpTotal );

    Moderator bcworkz

    (@bcworkz)

    $total['value'] contains not only the total, but several HTML tags for formatting. So first run it through strip_tags() so you end up with just the dollar value. Pioneer Web Design hit on the crux of the issue, the dollar sign is actually an HTML entity, so trimming ‘$’ has no effect. The fact it is an entity gets obscured when it is sent through email, even when viewing the source HTML.

    After stripping tags, you can remove the dollar sign/HTML entity with $totalVal = substr( $strpTotal, 5);

    Note that this is only valid for single currency symbols. If any currency ‘symbol’ is output similar to GBP or whatever, stripping the first 5 chars is invalid. A more universal approach would be to strip tags, decode entities, then extract only numeric and decimal (character varies by locale, extract both . ,) chars through preg_match(). For good measure, type juggle the resulting string to float.

Viewing 6 replies - 1 through 6 (of 6 total)
  • The topic ‘Cannot get php to trim();’ is closed to new replies.