Support

Account

Home Forums General Issues Upload PDF Manuals on all product pages and display all the uploaded value Reply To: Upload PDF Manuals on all product pages and display all the uploaded value

  • Ok, got this working.

    In your template:

    <?php
    $args = array(
      'posts_per_page' 	=> 3, #must match the value in settings > reading > Blog pages show at most
      'post_type'		=> 'product',
      'orderby'			=> 'date',
      'order'			=> 'DESC',  
      'paged'			=> $paged,
      'fields'			=> 'ids'      
    );
    $wp_query = new WP_Query($args);
    if ($wp_query->have_posts()) :
    	while ($wp_query->have_posts()) : $wp_query->the_post();
    the_title();
    $pdf_upload = get_field('pdf_upload');
    		if( $pdf_upload ): ?>
    			<li> <a href="<?php echo $pdf_upload['url']; ?>"><?php the_title; ?></a></li>
    		<?php endif; 
    
    	endwhile;
    endif; wp_reset_query(); ?>
    
    <?php
    #global $wp_query; // you can remove this line if everything works for you
     
    // don't display the button if there are not enough posts
    if (  $wp_query->max_num_pages > 1 )
    	echo '<div class="misha_loadmore">More posts</div>'; // you can use <a> as well
    ?>

    Create a javascript file called myloadmore.js and add the following:

    jQuery(function($){ // use jQuery code inside this to avoid "$ is not defined" error
    	$('.misha_loadmore').click(function(){
     
    		var button = $(this),
    		    data = {
    			'action': 'loadmore',
    			'query': misha_loadmore_params.posts, // that's how we get params from wp_localize_script() function
    			'page' : misha_loadmore_params.current_page
    		};
     
    		$.ajax({ // you can also use $.post here
    			url : misha_loadmore_params.ajaxurl, // AJAX handler
    			data : data,
    			type : 'POST',
    			beforeSend : function ( xhr ) {
    				button.text('Loading...'); // change the button text, you can also add a preloader image
    			},
    			success : function( data ){
    				if( data ) { 
    					button.text( 'More posts' ).prev().before(data); // insert new posts
    					misha_loadmore_params.current_page++;
     
    					if ( misha_loadmore_params.current_page == misha_loadmore_params.max_page ) 
    						button.remove(); // if last page, remove the button
     
    					// you can also fire the "post-load" event here if you use a plugin that requires it
    					// $( document.body ).trigger( 'post-load' );
    				} else {
    					button.remove(); // if no data, remove the button as well
    				}
    			}
    		});
    	});
    });

    In your functions file, add the following:

    function misha_my_load_more_scripts() {
     
    	global $wp_query; 
     
    	// In most cases it is already included on the page and this line can be removed
    	wp_enqueue_script('jquery');
     
    	// register our main script but do not enqueue it yet
    	wp_register_script( 'my_loadmore', get_stylesheet_directory_uri() . '/js/myloadmore.js', array('jquery') );
     
    	// now the most interesting part
    	// we have to pass parameters to myloadmore.js script but we can get the parameters values only in PHP
    	// you can define variables directly in your HTML but I decided that the most proper way is wp_localize_script()
    	wp_localize_script( 'my_loadmore', 'misha_loadmore_params', array(
    		'ajaxurl' => site_url() . '/wp-admin/admin-ajax.php', // WordPress AJAX
    		'posts' => json_encode( $wp_query->query_vars ), // everything about your loop is here
    		'current_page' => get_query_var( 'paged' ) ? get_query_var('paged') : 1,
    		'max_page' => $wp_query->max_num_pages
    	) );
     
     	wp_enqueue_script( 'my_loadmore' );
    }
     
    add_action( 'wp_enqueue_scripts', 'misha_my_load_more_scripts' );

    Also in your functions file, add the following:

    
    function misha_loadmore_ajax_handler(){
     
    	// prepare our arguments for the query
    	$args = json_decode( stripslashes( $_POST['query'] ), true );
    	$args['paged'] = $_POST['page'] + 1; // we need next page to be loaded
    	$args['post_status'] = 'publish';
     
    	// it is always better to use WP_Query but not here
    	query_posts( $args );
     
    	if( have_posts() ) :
     
    		// run the loop
    		while( have_posts() ): the_post();
    	
    		$pdf_upload = get_field('pdf_upload');
    		if( $pdf_upload ): ?>
    			<li> <a href="<?php echo $pdf_upload['url']; ?>"><?php the_title(); ?></a></li>
    		<?php endif; 
    	
    		endwhile;
     
    	endif;
    	die; // here we exit the script and even no wp_reset_query() required!
    }
     
     
     
    add_action('wp_ajax_loadmore', 'misha_loadmore_ajax_handler'); // wp_ajax_{action}
    add_action('wp_ajax_nopriv_loadmore', 'misha_loadmore_ajax_handler'); // wp_ajax_nopriv_{action}

    Tried and tested!