Home > front end >  Product query results are not correct
Product query results are not correct

Time:11-10

I need a custom fields on the inventory tab that will be filled in with the zipcode as the location of the agent.

Armed with the references I got here, now I have that field.

what I want to ask is how to concatenate this meta data with woocommerce shortcode?

I think like :

['products limit="12" columns="4" zipcode="12345"]

where "12345" will be changing dynamically as needed (zipcode filled based on agent location).

I have tried to do something but it is not working properly.

Here's the full code.

function action_woocommerce_product_options_inventory_product_data_zipcode() {
woocommerce_wp_text_input( array(
    'id'            => '_zipcode',
    'label'         => __( 'Zipcode', 'woocommerce' ),
    'description'   => __( 'Please fill your zipcode.', 'woocommerce' ),
    'desc_tip'      => 'true',
    'placeholder'   => __( '12345', 'woocommerce' )
    ) );
}


add_action( 'woocommerce_product_options_inventory_product_data', 'action_woocommerce_product_options_inventory_product_data_zipcode' );

 // Save zipcode
 function action_woocommerce_admin_process_product_object_zipcode( $product ) {
 // Isset
 if ( isset( $_POST['_zipcode'] ) ) {        
       // Update
       $product->update_meta_data( '_zipcode', sanitize_text_field( $_POST['_zipcode'] ));
       }
 }
 add_action( 'woocommerce_admin_process_product_object', 'action_woocommerce_admin_process_product_object_zipcode', 10, 1 );

Try put to shortcode products :

function filter_shortcode_atts_products_zipcode ( $out, $pairs, $atts, $shortcode) {

  if ( isset ( $atts['zipcode'] ) && !empty($atts['zipcode']) ) {   
     $out['zipcode'] = true;
  } else {
     $out['zipcode'] = false;
  }

  return $out;
}

 add_filter( 'shortcode_atts_products', 'filter_shortcode_atts_products_zipcode', 10, 4);


function filter_woocommerce_shortcode_products_query_zipcode( $query_args, $atts, $type) {

    if ( $type == 'products' && $atts['zipcode'] ) {    
    
    // Meta query       
    $query_args['meta_query'] = array(
        array(
            'key'     => '_zipcode',
            'value'   => $atts['zipcode'],
            'compare' => 'LIKE',
         )
     );
  }

   return $query_args;
 }

 add_filter( 'woocommerce_shortcode_products_query', 'filter_woocommerce_shortcode_products_query_zipcode', 10, 3 );

On testing I tried :

['products limit="12" columns="4" zipcode="12345"]

shortcode has displayed the product but does not refer to the postal code in the short code ("12345") but to all products that have a postal code.

Can somebody help me?

Thank you

CodePudding user response:

Something doesn't feel right about the shortcode attribute function. I think you're setting the attribute as true and therefore it's comparing anything "truthy." Maybe just try setting the true one as the zipcode, like this:

function filter_shortcode_atts_products_zipcode ( $out, $pairs, $atts, $shortcode) {

  if ( isset ( $atts['zipcode'] ) && !empty($atts['zipcode']) ) {   
     $out['zipcode'] = $atts['zipcode'];
  } else {
     $out['zipcode'] = false;
  }

  return $out;
}

That way it'll return the zipcode if it exists, and false if it doesn't, which the query can then use for the comparison.

  • Related