• اطلاعیه ها

    • Morteza

      باهم بسازیم: اطلس ووکامرس و وردپرس   14/07/96

      تاپیک ایجاد شده برای بحث در جهت ایجاد یک منبع، ویکی، صفحات توضیحی و یا بخش آموزشی جامع برای وردپرس و متعلقات مختلف آن است. لطفا جهت مشارکت در این بحث، ارائه پیشنهاد و یا انتقاد به تاپیک فوق مراجعه کنید. باهم بسازیم: اطلس ووکامرس و وردپرس
maraljoon

کوئری نمایش محصولات ووکامرس بر اساس امتیاز

55 پست در این موضوع قرار دارد

منظورتون اینه که کد زیر رو تو فانکشن بذارم و کدی رو که جناب m4xs051 دادن تو قالب استفاده کنم؟؟

 

در 3 دقیقه قبل، mehran-b گفته است :

 


add_action('woocommerce_after_shop_loop_item', 'get_star_rating' );
function get_star_rating()
{
    global $woocommerce, $product;
    $average = $product->get_average_rating();
    echo '<div class="star-rating"><span style="width:'.( ( $average / 5 ) * 100 ) . '%"><strong itemprop="ratingValue" class="rating">'.$average.'</strong> '.__( 'out of 5', 'woocommerce' ).'</span></div>';
}

 

اگه همینطوره این کار رو انجام دادم ولی همچنان همه محصولات حتی اون هایی که هیچ امتیازی هم ندارن نمایش داده میشن

0

به اشتراک گذاری این پست


لینک به پست

درود مجدد

 

الان شما اینو به من بگو.

نتیجه این لوپ همونیه که شما احتیاج داری؟

$args = array(
'post_type' => 'product',
'posts_per_page' => 10,
'post_status' => 'publish',
'meta_key' => '_wc_average_rating',
'orderby' => 'meta_value_num'
);

$query = new WP_Query($args);

 

0

به اشتراک گذاری این پست


لینک به پست
در 4 دقیقه قبل، mehran-b گفته است :

درود مجدد

 

الان شما اینو به من بگو.

نتیجه این لوپ همونیه که شما احتیاج داری؟


$args = array(
'post_type' => 'product',
'posts_per_page' => 10,
'post_status' => 'publish',
'meta_key' => '_wc_average_rating',
'orderby' => 'meta_value_num'
);

$query = new WP_Query($args);

 

بله. جناب m4xs051 هم انگار تست کردن و جواب گرفتن. منم در صورتی که اون تکه کد رو اضافه کنم جواب میگیرم.

ولی خب در کل این لوپ همون چیزیه که نتیجه درست رو نمایش میده

0

به اشتراک گذاری این پست


لینک به پست

الان کد زیر رو در نظر بگیرید.

 

<?php

$args = array(
	'post_type' => 'product',
	'posts_per_page' => 10,
	'post_status' => 'publish',
	'meta_key' => '_wc_average_rating',
	'orderby' => 'meta_value_num'
);

$query = new WP_Query($args);

if($query->have_posts()) :
	while($query->have_posts()) :
		$query->the_post();
		
		the_title();
		
	endwhile;
endif;

?>

الان کد بالا بدون هیچ کد اضافه یعنی اگر اون فانکشنی که در پست های قبلی دربارش صحبت کردیم هم از فایل functions.php بردارید باید عنوان 10 محصول برتر رو بر اساس امتیاز نشون بده.

نشون میده؟

0

به اشتراک گذاری این پست


لینک به پست

ارسال شده در (ویرایش شده)

در 3 ساعت قبل، mehran-b گفته است :

نشون میده؟

نه متاسفانه. به همون شکله. یسری از محصولات رو که امتیازی هم ندارن نمایش میده

ویرایش شده در توسط maraljoon
0

به اشتراک گذاری این پست


لینک به پست
در 3 ساعت قبل، maraljoon گفته است :

نه متاسفانه. به همون شکله. یسری از محصولات رو که امتیازی هم ندارن نمایش میده

پس در نتیجه اون ویجت ووکامرس هم که میاد محصولات رو برای شما بر اساس پر امتیاز ترین ها لیست میکنه کار نمیکنه؟

چون ما این آرگومان متد سازنده WP_Query رو از اون ویجت برداشتیم.

0

به اشتراک گذاری این پست


لینک به پست
در 40 دقیقه قبل، mehran-b گفته است :

پس در نتیجه اون ویجت ووکامرس هم که میاد محصولات رو برای شما بر اساس پر امتیاز ترین ها لیست میکنه کار نمیکنه؟

چون ما این آرگومان متد سازنده WP_Query رو از اون ویجت برداشتیم.

درسته. اون رو هم تست کردم با همین مشکل مواجه هست

0

به اشتراک گذاری این پست


لینک به پست
در هم اکنون، maraljoon گفته است :

درسته. اون رو هم تست کردم با همین مشکل مواجه هست

خوب پس شما توی این قالبتون یه مشکل کدنویسی دارید که خروجی این حلقه رو داره بهم میزنه.

مثلا نمونه سادش رو بخوام بگم معمولا به علت اینه که بعد از پایان while هر حلقه WP_Query باید تابع wp_reset_postdata فراخوانی بشه.

<?php

$query = new WP_Query();

if($query->have_posts()) :
	while($query->have_posts()) :
		$query->the_posts();

	endwille;
	wp_reset_postdata();
endif;

یعنی تمام حلقه های WP_Query باید ساختارشون به این شکل باشه اگر نباشه حلقه های بعد از این حلقه به مشکل میخوره.

0

به اشتراک گذاری این پست


لینک به پست
در 37 دقیقه قبل، mehran-b گفته است :

یعنی تمام حلقه های WP_Query باید ساختارشون به این شکل باشه اگر نباشه حلقه های بعد از این حلقه به مشکل میخوره.

تا جایی که چک کردم این مورد رو برطرف کردم ولی همچنان اون مور سرجاشه. نمیدونم شاید تداخل با افزونه های دیگه باشه.

اون تکه کدی که باعث میشه پر امتیاز هارو نمایش بده برام، چطور میتونم تو اون لوپ استفادش کنم که فوتر با مشکل مواجه نشه؟؟

منظورم اینه:

function get_star_rating()

 همین کد باعث میشه نمایش داده بشن.

کد های فوتر هم به این صورته:

</div>            
<?php it_theme_footer(); ?>
<div id="to-top" class="bag-s"><span class="fa fa-chevron-up"></span></div>
</div>
<script>
	    jQuery( document ).ready(function( $ )
		{
		var url = window.location.href;
	    	jQuery("#sfsiid_custom").attr('href', "");
		});
	 </script>
<?php wp_footer(); ?>





</body>
</html>

 

0

به اشتراک گذاری این پست


لینک به پست

مثلا چطور میشه این کد رو 

function get_star_rating()

تو کد زیر استفاده کرد ؟ شدنیه؟

<!-- Carousel -->
<div id="promo-carousel" class="carousel slide" data-ride="carousel">

  <!-- Wrapper for slides -->
  <div class="carousel-inner" role="listbox">

    <?php
	
    // Item size (set here the number of posts for each group)
    $i = 4; 

    // Set the arguments for the query
   
		    $args = array(

		'post_type' => 'product',
	'posts_per_page' => 10,
	'post_status' => 'publish',
	'meta_key' => '_wc_average_rating',
	'orderby' => 'meta_value_num'
		
);


 $loop = new WP_Query( $args );

    // Get the posts
    $myposts = get_posts($args) ; 
	

    // If there are posts
    if($myposts):

      // Groups the posts in groups of $i
      $chunks = array_chunk($myposts, $i);
      $html = "";

      /*
       * Item
       * For each group (chunk) it generates an item
       */
      foreach($chunks as $chunk):
	  
        // Sets as 'active' the first item
        ($chunk === reset($chunks)) ? $active = "active" : $active = "";
        $html .= '<div class="item '.$active.'"><div class="container"><div class="row">';
  	  


        /*
         * Posts inside the current Item
         * For each item it generates the posts HTML
         */
        foreach($chunk as $post): 
          $html .= '<div class="col-xs-12 col-sm-6 col-md-3 col-lg-3">';
          $html .= get_the_title($post->ID);
		  
		  
          $html .= '</div>';
        endforeach;

        $html .= '</div></div></div>';	

      endforeach;

      // Prints the HTML
      echo $html;

    endif;
    ?>

  </div> <!-- carousel inner -->


  <!-- Controls -->
  <a class="left carousel-control" href="#promo-carousel" role="button" data-slide="prev">
    <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
    <span class="sr-only">Previous</span>
  </a>
  <a class="right carousel-control" href="#promo-carousel" role="button" data-slide="next">
    <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
    <span class="sr-only">Next</span>
  </a>

</div> <!-- /carousel -->

 

0

به اشتراک گذاری این پست


لینک به پست

خوب من نظرم اینه که مستقیم کوئری بزنیم به دیتابیس وردپرس ببینیم جواب می گیریم یا خیر.

 

شما تابع زیر رو بذار توی فایل functions.php قالبت.

function mehran_top_rating_title() {
	
	global $wpdb;
	
	$post_titles = $wpdb->get_results($wpdb->prepare("SELECT post_title FROM $wpdb->posts AS posts, $wpdb->postmeta AS postmeta WHERE posts.ID = postmeta.post_id AND postmeta.meta_key = %s AND posts.post_status = %s AND posts.post_type = %s ORDER BY postmeta.meta_value DESC LIMIT 10", "_wc_average_rating", "publish", "product"), ARRAY_N);
	
	foreach($post_titles as $post_title)
		$output = $post_title[0] . "<br>";
		
	return $output;
	
}

بعد توی فایل های دیگه قالب مثل سایدبار یا هر فایل دیگه غیر از functions.php این تابع رو اینطوری فراخوانی کن:

<?php echo mehran_top_rating_title(); ?>

ببین توی خروجی عنوان 10 محصول برتر رو میگیری یا خیر؟

0

به اشتراک گذاری این پست


لینک به پست

عذر میخوام تابع به این شکل میشه:

 

function mehran_top_rating_title() {
	
	global $wpdb;
	
	$post_titles = $wpdb->get_results($wpdb->prepare("SELECT post_title FROM $wpdb->posts AS posts, $wpdb->postmeta AS postmeta WHERE posts.ID = postmeta.post_id AND postmeta.meta_key = %s AND posts.post_status = %s AND posts.post_type = %s ORDER BY ABS(postmeta.meta_value) DESC LIMIT 10", "_wc_average_rating", "publish", "product"), ARRAY_N);

	$output = '';
	foreach($post_titles as $post_title)
		$output .= $post_title[0] . "<br>";
		
	return $output;
	
}

 

0

به اشتراک گذاری این پست


لینک به پست
در 24 دقیقه قبل، mehran-b گفته است :

 


function mehran_top_rating_title() {
	
	global $wpdb;
	
	$post_titles = $wpdb->get_results($wpdb->prepare("SELECT post_title FROM $wpdb->posts AS posts, $wpdb->postmeta AS postmeta WHERE posts.ID = postmeta.post_id AND postmeta.meta_key = %s AND posts.post_status = %s AND posts.post_type = %s ORDER BY ABS(postmeta.meta_value) DESC LIMIT 10", "_wc_average_rating", "publish", "product"), ARRAY_N);

	$output = '';
	foreach($post_titles as $post_title)
		$output .= $post_title[0] . "<br>";
		
	return $output;
	
}

 

این تابع چه تعداد محصول رو باید نمایش بده؟؟

0

به اشتراک گذاری این پست


لینک به پست
در هم اکنون، maraljoon گفته است :

این تابع چه تعداد محصول رو باید نمایش بده؟؟

10 تا.

0

به اشتراک گذاری این پست


لینک به پست
در 1 دقیقه قبل، mehran-b گفته است :

10 تا.

کدهارو جاگذاری کردم. مثل روال قبلی داره 10 تا عنوان از محصولاتی که امتیاز ندارن رو نمایش میده. البته 2 تا از ااین لیست امتیاز دارن ولی بقیه نه

0

به اشتراک گذاری این پست


لینک به پست

@maraljoon , @mehran-b

 

این کد داره بخوبی کار میکنه. بنده تست کردم و مشکلی نداره.

این کد رو تو فانکش گذاشتم:
 

function mehran_top_rating_title() {
  
  global $wpdb;
  
  $post_titles = $wpdb->get_results($wpdb->prepare("SELECT post_title FROM $wpdb->posts AS posts, $wpdb->postmeta AS postmeta WHERE posts.ID = postmeta.post_id AND postmeta.meta_key = %s AND posts.post_status = %s AND posts.post_type = %s ORDER BY ABS(postmeta.meta_value) DESC, DATE(posts.post_date) DESC LIMIT 10", "_wc_average_rating", "publish", "product"), ARRAY_N);

  $output = '';
  foreach($post_titles as $post_title)
    $output .= $post_title[0] . "<br>";
    
  return $output;
  
}

 

و این کد رو هم تو یه یه فایل گذاشتم و تست کردم تا خروجی رو چاپ کنه:

<?php echo mehran_top_rating_title(); ?>

 

 نکته ۱: محصولات شما اصلا امتیازی براشون ثبت شده؟ 

نکته ۲: دستور فراخوانی تابع رو تو یه page template جدید قرار بدید و تست بگیرید. ببینید باز هم مشکلتون پا برجاست یا نه.

 


 

1

به اشتراک گذاری این پست


لینک به پست
در 14 ساعت قبل، maraljoon گفته است :

کدهارو جاگذاری کردم. مثل روال قبلی داره 10 تا عنوان از محصولاتی که امتیاز ندارن رو نمایش میده. البته 2 تا از ااین لیست امتیاز دارن ولی بقیه نه

سلام مجدد

 

ما با کد آخری که تقدیمتون کردم مستقیم داریم به دیتابیس وردپرس بدون هیچ واسطه ای و اعمال هیچ هوکی کوئری میزنیم.

احتمال اینکه خروجی اشتباه باشه در حد صفر است.

نکاتی که جناب @m4xs051 فرمودن رو بررسی کنید شاید بتونید منبع مشکل رو پیدا کنید.

1

به اشتراک گذاری این پست


لینک به پست

ارسال شده در (ویرایش شده)

در 14 ساعت قبل، m4xs051 گفته است :

 

 نکته ۱: محصولات شما اصلا امتیازی براشون ثبت شده؟ 

نکته ۲: دستور فراخوانی تابع رو تو یه page template جدید قرار بدید و تست بگیرید. ببینید باز هم مشکلتون پا برجاست یا نه.

 


 

بله. 3 محصول هست که امتیاز براشون ثبت شده

دقیقا همینکاری که شما انجام دادید رو انجام دادم ولی متاسفانه مشکل برطرف نشده.

ویرایش شده در توسط maraljoon
0

به اشتراک گذاری این پست


لینک به پست
در 25 دقیقه قبل، mehran-b گفته است :

سلام مجدد

 

ما با کد آخری که تقدیمتون کردم مستقیم داریم به دیتابیس وردپرس بدون هیچ واسطه ای و اعمال هیچ هوکی کوئری میزنیم.

احتمال اینکه خروجی اشتباه باشه در حد صفر است.

نکاتی که جناب @m4xs051 فرمودن رو بررسی کنید شاید بتونید منبع مشکل رو پیدا کنید.

دقیقا همینکار رو انجام دادم. نمیدونم دلیلش چیه که هیچ تغییری نمیکنه. الان تعدا محصولاتی که امتیاز دارن رو بیشتر کردم. ولی باز یسری رو هم نمایش میده که امتیاز ندارن

0

به اشتراک گذاری این پست


لینک به پست
در 1 دقیقه قبل، maraljoon گفته است :

دقیقا همینکار رو انجام دادم. نمیدونم دلیلش چیه که هیچ تغییری نمیکنه. الان تعدا محصولاتی که امتیاز دارن رو بیشتر کردم. ولی باز یسری رو هم نمایش میده که امتیاز ندارن

خوب چون خروجی 10 تا باید بده از محصول پر امتیاز شروع میشه میره تا محصول هایی که هیچ امتیازی ندارن.

ترتیب عناوین بر اساس پر امتیاز به کم امتیاز یا بی امتیاز نیست؟

0

به اشتراک گذاری این پست


لینک به پست
در 3 دقیقه قبل، mehran-b گفته است :

خوب چون خروجی 10 تا باید بده از محصول پر امتیاز شروع میشه میره تا محصول هایی که هیچ امتیازی ندارن.

ترتیب عناوین بر اساس پر امتیاز به کم امتیاز یا امتیاز نیست؟

تعداد محصولاتی که امتیاز داشته باشن رو بیشتر کردم. جالب اینجاست که یسری از اونارو نمایش نمیده ولی داره همراه با چند موردی که امتیاز دارن چند محصول بدون امتیاز رو هم نمایش میده.

0

به اشتراک گذاری این پست


لینک به پست
در 1 دقیقه قبل، maraljoon گفته است :

تعداد محصولاتی که امتیاز داشته باشن رو بیشتر کردم. جالب اینجاست که یسری از اونارو نمایش نمیده ولی داره همراه با چند موردی که امتیاز دارن چند محصول بدون امتیاز رو هم نمایش میده.

چیزی که دارید میگید جالب که چه عرض کنم شگفت انگیزه! :huh:

0

به اشتراک گذاری این پست


لینک به پست
در ۱ ساعت قبل، mehran-b گفته است :

چیزی که دارید میگید جالب که چه عرض کنم شگفت انگیزه! :huh:

ببخشید من تو کد زیر چطور میتونم به تامنلیز و تایتل پرمالینک اضافه کنم؟؟

 <!-- Carousel -->
<div id="promo-carousel" class="carousel slide" data-ride="carousel">

  <!-- Wrapper for slides -->
  <div class="carousel-inner" role="listbox">

    <?php
    // Item size (set here the number of posts for each group)
    $i = 4; 

    // Set the arguments for the query
    global $post; 
    $args = array(
  'post_type' => 'product',
  'posts_per_page' => 8,
  'post_status' => 'publish',
  'meta_key' => '_wc_average_rating',
  'orderby' => 'meta_value_num'
);

$query = new WP_Query($args);

    // Get the posts
    $myposts = get_posts($args);

    // If there are posts
    if($myposts):

      // Groups the posts in groups of $i
      $chunks = array_chunk($myposts, $i);
      $html = "";

      /*
       * Item
       * For each group (chunk) it generates an item
       */
      foreach($chunks as $chunk):
        // Sets as 'active' the first item
        ($chunk === reset($chunks)) ? $active = "active" : $active = "";
        $html .= '<div class="item '.$active.'"><div class="container"><div class="row">';
  
        /*
         * Posts inside the current Item
         * For each item it generates the posts HTML
         */
        foreach($chunk as $post):
          $html .= '<div class="col-xs-12 col-sm-6 col-md-3 col-lg-3">';
          $html .= get_the_post_thumbnail(); 
          $html .= get_the_title($post->ID);
      $html .= '</a>';
          $html .= '</div>';
        endforeach;

        $html .= '</div></div></div>';  

      endforeach;

      // Prints the HTML
      echo $html;

    endif;
    ?>

  </div> <!-- carousel inner -->


  <!-- Controls -->
  <a class="left carousel-control" href="#promo-carousel" role="button" data-slide="prev">
    <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
    <span class="sr-only">Previous</span>
  </a>
  <a class="right carousel-control" href="#promo-carousel" role="button" data-slide="next">
    <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
    <span class="sr-only">Next</span>
  </a>


</div> <!-- /carousel -->

 

0

به اشتراک گذاری این پست


لینک به پست

تصمیم گرفتم یکار دیگه انجام بدم. البته نمیدونم شدنیه یا نه.

افزونه  yith-woocommerce-advanced-reviews رو نصب کردم که با استفاده از افزونه امتیاز دهی بشه به محصولات.

حالا میخوام تست کنم meta_key امتیاز دهی مربوط به این افزونه رو پیدا کنم و توی لوپ ازش استفاده کنم شاید مشکل رفع بشه.

آیا این شدنیه؟؟ اگه شدنیه چطور متا کی مربوط به این افزونه رو پیدا کنم؟؟

0

به اشتراک گذاری این پست


لینک به پست

عجیبه تگ پایان لینک هست ولی تگ شروعش نیست.

 <!-- Carousel -->
<div id="promo-carousel" class="carousel slide" data-ride="carousel">

  <!-- Wrapper for slides -->
  <div class="carousel-inner" role="listbox">

    <?php
    // Item size (set here the number of posts for each group)
    $i = 4; 

    // Set the arguments for the query
    global $post; 
    $args = array(
  'post_type' => 'product',
  'posts_per_page' => 8,
  'post_status' => 'publish',
  'meta_key' => '_wc_average_rating',
  'orderby' => 'meta_value_num'
);

$query = new WP_Query($args);

    // Get the posts
    $myposts = get_posts($args);

    // If there are posts
    if($myposts):

      // Groups the posts in groups of $i
      $chunks = array_chunk($myposts, $i);
      $html = "";

      /*
       * Item
       * For each group (chunk) it generates an item
       */
      foreach($chunks as $chunk):
        // Sets as 'active' the first item
        ($chunk === reset($chunks)) ? $active = "active" : $active = "";
        $html .= '<div class="item '.$active.'"><div class="container"><div class="row">';
  
        /*
         * Posts inside the current Item
         * For each item it generates the posts HTML
         */
        foreach($chunk as $post):
          $html .= '<div class="col-xs-12 col-sm-6 col-md-3 col-lg-3">';
          $html .= '<a href="'.get_permalink($post->ID).'">';
          $html .= get_the_post_thumbnail($post->ID); 
          $html .= get_the_title($post->ID);
          $html .= '</a>';
          $html .= '</div>';
        endforeach;

        $html .= '</div></div></div>';  

      endforeach;

      // Prints the HTML
      echo $html;

    endif;
    ?>

  </div> <!-- carousel inner -->


  <!-- Controls -->
  <a class="left carousel-control" href="#promo-carousel" role="button" data-slide="prev">
    <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
    <span class="sr-only">Previous</span>
  </a>
  <a class="right carousel-control" href="#promo-carousel" role="button" data-slide="next">
    <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
    <span class="sr-only">Next</span>
  </a>


</div> <!-- /carousel -->

 

1

به اشتراک گذاری این پست


لینک به پست

برای ارسال نظر یک حساب کاربری ایجاد کنید یا وارد حساب خود شوید

برای اینکه بتوانید نظر ارسال کنید نیاز دارید که کاربر سایت شوید

ایجاد یک حساب کاربری

برای حساب کاربری جدید در انجمن ما ثبت نام کنید. عضویت خیلی ساده است !


ثبت نام یک حساب کاربری جدید

ورود به حساب کاربری

دارای حساب کاربری هستید؟ از اینجا وارد شوید


ورود به حساب کاربری