asp_query_args & post_in

This topic contains 9 replies, has 2 voices, and was last updated by willfaulds59 willfaulds59 1 year, 4 months ago.

Viewing 10 posts - 1 through 10 (of 10 total)
  • Author
    Posts
  • #35204
    willfaulds59
    willfaulds59
    Participant

    Hello,

    I’m loving ASP.

    I’m working with WooCommerce and want to create links to very specific dynamically lists of products (specified by post ids).

    I thought I was on to a winner with https://knowledgebase.ajaxsearchpro.com/hooks/filters/query-and-output/asp_query_args#post_in-posts-by-ids.

    But I cannot work out a way to get access to the query string in the filter. Most probably because it is being called by AJAX…

    $_REQUEST shows:

    Array
    (
        [action] => ajaxsearchpro_search
        [aspp] =>
        [asid] => 1
        [asp_inst_id] => 1_1
        [options] => current_page_id=32&woo_currency=GBP&qtranslate_lang=0&filters_changed=0&filters_initial=1&asp_gen%5B%5D=title&asp_gen%5B%5D=content&asp_gen%5B%5D=excerpt&customset%5B%5D=product&force_count=10&force_order=1
        [autop] => 1
        [woocommerce-login-nonce] =>
        [_wpnonce] =>
        [woocommerce-reset-password-nonce] =>
    )

    Have you any idea how I can set a list of post_in ids for the initial (onLoad only) results dynamically via the page query string?

    • This topic was modified 1 year, 5 months ago by willfaulds59 willfaulds59.
    #35207
    willfaulds59
    willfaulds59
    Participant

    I can see a potential method… but can’t get it working.

    The $_REQUEST [options] contains some of the query string.

    I have tried registering a custom query variable

    add_filter( 'query_vars', 'add_query_vars_filter' );
    function add_query_vars_filter( $vars ){
      $vars[] = 'custom_var';
      return $vars;
    }

    but ASP but not pass it to the asp_query_args filter/AJAX call

    I have tried adding a custom ASP front-end filter

    add_action('asp_pre_parse_filters', 'asp_add_my_own_filters', 10, 2);
    function asp_add_my_own_filters($search_id, $options) {
            $filter = wd_asp()->front_filters->create(
                'custom_field',
                'Text stock',
                // text or hidden
                'text',
                array(
                    'field' => '_stock_status',
                    // See operator list on above example
                    'operator' => 'eq'
                )
            );
            $filter->add(array(
                'label' => 'Stock status',
                'value' => 'instock',
                'default' => 'instock'
            ));
            $filter->selectByOptions($options);
            wd_asp()->front_filters->add($filter);
    }

    but I cannot override this via the query string…

    Any ideas as to a viable solution?

    • This reply was modified 1 year, 5 months ago by willfaulds59 willfaulds59.
    #35209
    willfaulds59
    willfaulds59
    Participant

    Another dead end 🙁

    add_filter("asp_query_args", "asp_query_args_change", 10, 2);
    function asp_query_args_change($args, $search_id) {
    	
    	//WORKAROUND:set a search term?
    	// $args[s]=searchterm
    	// &asp_s='+encodeURIComponent('related_items:')
    	// &asp_s=related_items%3A
    	
    	//as this is loaded via AJAX I cannot access the query string, $_REQUEST doesn't hold the referer URL either :(	
    	
    	if($args['s'])
    	{	
    		$searchterm = $args['s'];
    		if ( strpos( $searchterm, 'related_items:' ) !== false) {
    			$id_string = str_replace('related_items:', '', $searchterm);
    			$ids = explode(',',$id_string);
    			$args['post_in'] = array_unique( $ids );
    			$args['s']='';
    		}
    	}
    
    	//TODO stop the search term showing in search box
    	return $args;
    }

    I thought I had a great workaround but unfortunately the $args[‘post_in’] seems to only apply to standard WP posts?

    Any better solutions/imporvements for WC products?

    #35210
    Ernest Marcinko
    Ernest Marcinko
    Keymaster

    Hi,

    The problem with this is, that the separate pageview (in this case ajax request) can not see the previous pageview query arguments. To achieve that, it has to be passed on. I think the easiest way is this:

    add_action('asp_layout_in_form', 'asp_layout_in_form_add_input');
    function asp_layout_in_form_add_input() {
    	?>
    	<input type="hidden"
    		   name="my_custom_variable"
    		   value="<?php echo esc_attr($_GET['your_variable']); ?>">
    	<?php
    }
    
    add_filter( 'asp_query_args', 'asp_change_some_variables', 10, 2 );
    function asp_change_some_variables( $args, $id ) {
    	if ( isset($_POST['options']) ) {
    		parse_str($_POST['options'], $options);
    		if ( isset($options['my_custom_variable']) ) {
    			$ids = explode(',', $options['my_custom_variable']);
    			$args['post_in'] = array_unique(
    				array_merge($args['post_in'], $ids)
    			);
    		}
    	}
    	return $args;
    }

    The first action is executed, whenever the search bar settings form is printed. There, the original $_REQEST, $_GET, $_POST variables will contain the values from the initial pageview. You can use that hook to print additional input fields to the form, which will get passed on to the ajax request.

    In the example above, I passed the value from the $_GET['your_variable'] query string to the “my_custom_variable” input field. This is serialized into the $_POST['options'] variable, which can be decoded via the parse_str($_POST['options'], $options); call. From there the $options['my_custom_variable'] will contain the string value you passed to the original page.

    Best,
    Ernest Marcinko

    If you like my products, don't forget to rate them on codecanyon :)


    #35213
    willfaulds59
    willfaulds59
    Participant

    Aha, yes that’s a good solution to passing the variables.

    Do you have a recommendation for a similar functionality to the post_in arg for Woocommerce products?

    #35214
    Ernest Marcinko
    Ernest Marcinko
    Keymaster

    The post_in argument applies to every post type within the live search (if you mean that).

    Best,
    Ernest Marcinko

    If you like my products, don't forget to rate them on codecanyon :)


    #35242
    willfaulds59
    willfaulds59
    Participant

    Thank you Ernest, after debugging for a while I have found why I thought the post_in did not work for WooCommerce products.

    When

    $args['post_in'] is set the AJAX call to admin-ajax.php response does not contain any HTML – its a data JSON only. I will copy into a private reply the Headers and Response from Chrome Dev tools.

    • This reply was modified 1 year, 5 months ago by willfaulds59 willfaulds59.
    • This reply was modified 1 year, 5 months ago by willfaulds59 willfaulds59.
    • This reply was modified 1 year, 5 months ago by willfaulds59 willfaulds59.
    #35246
    willfaulds59
    willfaulds59
    Participant
    You cannot access this content.
    #35271
    willfaulds59
    willfaulds59
    Participant

    I have noticed some missing results elsewhere so I’m going to debug the issue today and see if its being caused by a modification/override/plugin.

    #35345
    willfaulds59
    willfaulds59
    Participant

    Thanks for you’re help finding a working solution to passing a custom variable I have a reliable solution now.

    The missing results seemed to be a weird behaviour of WooCommerce variable product types and was not specific to ASP.

Viewing 10 posts - 1 through 10 (of 10 total)

You must be logged in to reply to this topic.