• اطلاعیه ها

    • Morteza

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

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

ایجاد فیلتر مرتب سازی پست ها در حلقه کوئری صفحه ایندکس

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

سلام دوستان..

بدنبال روشی بودم که بتونم در صفحه اصلی سایت در بخشی که با استفاده از حلقه جدیدترین مطالب رو نمایش میددم یک فیلتر مرتب سازی مثل فیلتر مرتب سازی همیار  ایجاد کنم. با سرچ هایی که کردم تو سایت های خارجی یه مورد پیدا کردم ولی چون انگلیشم تعریف زیادی نداره نتوستم خیلی خوب از آموزش استفاده کنم.

لینک رو اینجا میذارم اگه دوستان زحت بکشن و آموزش رو ببینن و چیز دستگیرشون شد اینجا بگن..

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

تشکر فراوان

لینک سایت خارجی : https://premium.wpmudev.org/blog/add-post-filters/

0

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


لینک به پست

سلام

 

والا این بحث توضیحش مفصله و هم کار گرافیکی و کدنویسی توی فرانت اِند داره و هم کار کدنویسی در بخش بک اِند داره.

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

0

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


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

سلام

 

والا این بحث توضیحش مفصله و هم کار گرافیکی و کدنویسی توی فرانت اِند داره و هم کار کدنویسی در بخش بک اِند داره.

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

ممنونم..

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

0

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


لینک به پست

سلام مجدد

 

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

<form method="post">
	<select name="order">
		<option value="ASC">صعودی</option>
		<option value="DESC">نزولی</option>
	</select>
	<input type="submit" name="filter_now" value="اعمال تغییرات" />
</form>

شما کد بالا رو توی یه جایی از کدهای قالبتون بذارید بعد برید ازش استفاده کنید یعنی مثلا رو صعودی تنظیمش کنید و اعمال تغییرات رو بزنید ببینید که واقعا ترتیب پست های صفحه اصلی رو صعودی (از اولین پست به آخرین پست) میکنه؟

ویرایش شده در توسط mehran-b
1

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


لینک به پست
در در 9/20/2017 at 11:19، mehran-b گفته است :

سلام مجدد

 

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


<form method="post">
	<select name="order">
		<option value="ASC">صعودی</option>
		<option value="DESC">نزولی</option>
	</select>
	<input type="submit" name="filter_now" value="اعمال تغییرات" />
</form>

شما کد بالا رو توی یه جایی از کدهای قالبتون بذارید بعد برید ازش استفاده کنید یعنی مثلا رو صعودی تنظیمش کنید و اعمال تغییرات رو بزنید ببینید که واقعا ترتیب پست های صفحه اصلی رو صعودی (از اولین پست به آخرین پست) میکنه؟

ممنون از شما..

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

چطور ازش توی حلقه استفاده کنم.. یعنی اگه بیرو از حلقه هم باشه با استفاده از متد پست باید جواب بده؟؟

1

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


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

چطور ازش توی حلقه استفاده کنم.. یعنی اگه بیرو از حلقه هم باشه با استفاده از متد پست باید جواب بده؟؟

داخل حلقه که قطعا نباید باشه باید بیرون حلقه قرارش بدید.

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

حتی روی قالب پیشفرض 2017 وردپرس هم کار کرد !

0

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


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

داخل حلقه که قطعا نباید باشه باید بیرون حلقه قرارش بدید.

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

حتی روی قالب پیشفرض 2017 وردپرس هم کار کرد !

من نتونستم ازش جواب بگیرم..

مشکل از کجاست؟

0

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


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

من نتونستم ازش جواب بگیرم..

مشکل از کجاست؟

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

پ.ن: اگر موردی که گفتم توی سایت شما جواب نده یعنی حلقه صفحه index.php شما احتمالا حلقه اصلی نیست و مثلا با WP_Query پیاده شده است.

1

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


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

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

پ.ن: اگر موردی که گفتم توی سایت شما جواب نده یعنی حلقه صفحه index.php شما احتمالا حلقه اصلی نیست و مثلا با WP_Query پیاده شده است.

ممنونم از شما.

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

منبعی رو سراغ دارید که بشه  پارامتر های مختلف برای این فیلتر توش پیدا کرد؟؟

مثلا غیر از اون پارامتر  صعودی یا نزولی بشه از پارامترهایی مثل : بر اساس جدیدترین ها ، بر اساس جدیدترین دیدگاه ها
بر اساس بازدید و  بر اساس زمان که روز هفته و ماه رو شامل میشه و بر اساس دسته.

 

 

0

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


لینک به پست
نقل قول

ممنونم از شما.

خواهش میکنم.

توی این صفحه اگر توجه کنید لیستی که عنوانش public هست توسط این روش پشتیبانی میشه.

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

0

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


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

خواهش میکنم.

توی این صفحه اگر توجه کنید لیستی که عنوانش public هست توسط این روش پشتیبانی میشه.

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

از این لینک چیزی پیدا نکردم.

تونستم با comment_count پست ها رو بر اساس تعداد دیدگاه مرتب کنم. با همون روشی  که گفتید قابل اجراس.

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

تو سایت از متا کی  the_view برای بازدید ها استفاده میکنم. باید از این متا استفاده کرد یا اینکه راه دیگه ای داره؟

ببخشید اینقدر سوال میپرسم.

 

0

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


لینک به پست

چرا میشه بازدید هم اضافه کرد.

 

ابتدا باید به کوئری های وردپرس یه متغییر جدید مثلا به اسم بازدید اضافه کنید به این شکل:

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

بعد به اکشن pre_get_posts میگید اگر این کوئری مقدار براش وارد شده بود بیاد روی حلقه اصلی مرتب سازی بر اساس بازید رو پیاده کنه.

function mehran_view_order($query) {
    if ($query->is_home() && $query->is_main_query() && get_query_var('bazdid', false) !== false) {
        $query->set('meta_key', 'the_view');
        $query->set('orderby', 'meta_value_num');
    }
}
add_action('pre_get_posts', 'mehran_view_order');

الان شما بیاید آدرس سایتتون رو به این شکل بزنید:

http://domain.com/?bazdid=1

میاد پست ها رو از بیشترین بازدید به کمترین بازدید مرتب میکنه.

توجه کنید که کدهایی رو که دادم باید توی functions.php قالبتون قرار بدید.

ویرایش شده در توسط mehran-b
1

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


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

چرا میشه بازدید هم اضافه کرد.

...................

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

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

مثلا سلکت باکس اولی به این شکله:
 

 <select name="orderby">
		<?php
			$orderby_options = array(
				'comment_count' => 'محبوب‌ترین مطالب: بر اساس دیدگاه',
			);
			foreach( $orderby_options as $value => $label ) {
				echo "<option ".selected( $_GET['orderby'], $value )." value='$value'>$label</option>";
			}
			
		?>
       
       
</select>

وقتی ارسال میشه بعد  آدرس سایت ?orderby=comment_count  رو اضافه میکنه.

چطور باید اون bazdid رو به این سلکت باکس اضافه کنم که بر اساس order by نمایش نده. بجاش مثلا همون ?bazdid=1 رو اضافه کنه..

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

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


لینک به پست

سلام مجدد

 

عذر میخوام تاخیر در پاسخ دادن ایجاد میشه.

برای این چیزی که شما میخواید باید کوئری رزرو شده orderby رو بیخیالش بشید و بیایید یه کوئری orderby اختصاصی برای خودتون اضافه کنید به شکل زیر:

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

بعد بازم میاید این کوئری رو که تعریف کردید توی تابع اکشن pre_get_posts مقدارش رو چک میکنید تا مرتب سازی رو بر اساس مقدار کوئریتون تغییر بدید مثل زیر:

function mehran_orderby($query) {
    if ($query->is_home() && $query->is_main_query() && get_query_var('mehran_orderby', false) !== false) {
		if(get_query_var('mehran_orderby') == "view") {
			$query->set('meta_key', 'the_view');
			$query->set('orderby', 'meta_value_num');
		}
		if(get_query_var('mehran_orderby') == "comment") {
			$query->set('orderby', 'comment_count');
		}
    }
}
add_action('pre_get_posts', 'mehran_orderby');

بعد اون سلکت باکستون هم این شکلی میشه:

محبوب ترین مطالب بر اساس : <select name="mehran_orderby">
	<?php
		$orderby_options = array(
			'comment' => 'تعداد دیدگاه',
			'view' => 'تعداد بازدید',
		);
		foreach($orderby_options as $value => $label) {
			echo "<option ".selected( $_GET['orderby'], $value )." value='$value'>$label</option>";
		}
	?>   
</select>

 

موفق باشید

0

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


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

سلام مجدد

.........

واقعا ممنونم از حوصله ای که بخرج دادین..

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

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

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

به این شکل:

if(get_query_var('filter_orderby') == "ASC") {
			$query->set('order', 'ASC');

 

0

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


لینک به پست

سلام مجدد

 

والا شما هم خوب یاد میگیری.

if(get_query_var('filter_orderby') == "ASC") {
	$query->set('order', 'ASC');

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

 

پاینده باشید

1

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


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

پاینده باشید

سلام.. بازم ممنونم. کارم خیلی جلو افتاد

یک سوال دیگه. اگه امکانش هست تا حدی که میشه راهنماییم کنید. تشکر

اگه بخوام توی این فرم یک سلکت باکس دیگه بگیرم که بر اساس دسته بندی هم مرتب بشه نیاز هست که با همون کوئری orderby کار کنم؟؟

مثلا میخوام به این صورت بنویسم:

<select name="" id="category">
	<option value="allcat">همه دسته ها</option>
	<option value="cat id">دسته اول</option>
	<option value="cat id">دسته دوم</option>
	<option value="cat id">دسته سوم</option>
</select>

آیدی این دسته ها رو دستی وارد کنم؟؟

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

0

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


لینک به پست

سلام

 

برای این کار باید دو تا متغییر به کوئری های وردپرس اضافه کنید.

برای شروع با استفاده از فیلتر query_vars میایم دو تا متغییر یکی برای orderby و یکی هم برای category به کوئری های وردپرس اضافه می کنیم.

function add_query_vars($vars) {
	$vars[] = 'filter_orderby';
	$vars[] = 'filter_category';
	return $vars;
}
add_filter('query_vars', 'add_query_vars');

سپس باید متغییرهای جدید رو توی اکشن pre_get_posts مانند مثال های قبلی کنترل کنیم.

function my_query_filter($query) {
    if($query->is_home() && $query->is_main_query()) {
		if(get_query_var('filter_category', false)) {
			if(get_query_var('filter_category') != "all" && is_numeric(get_query_var('filter_category')))
				$query->set('cat', get_query_var('filter_category'));
		}
		if(get_query_var('filter_orderby', false)) {
			if(get_query_var('filter_orderby') == "view") {
				$query->set('meta_key', 'the_view');
				$query->set('orderby', 'meta_value_num');
			}
			if(get_query_var('filter_orderby') == "comment")
				$query->set('orderby', 'comment_count');
		}
    }
}
add_action('pre_get_posts', 'my_query_filter');

سپس میایم توی فرانت اِند قضیه و فرم دارای سلکت باکس ها.

<form method="get" dir="rtl">
<select name="filter_orderby">
	<?php
		$orderby_options = array(
			'comment' => 'تعداد دیدگاه',
			'view' => 'تعداد بازدید',
		);
		?>
		<option selected disabled hidden>محبوب ترین مطالب بر اساس</option>
		<?php
		foreach($orderby_options as $value => $label) {
			echo '<option '.selected($_GET['filter_orderby'], $value).' value="' . esc_attr($value) . '">' . esc_html($label) . '</option>';
		}
	?>   
</select>
<select name="filter_category">
	<?php
		$category_options = array(
			'all' => 'همه دسته ها'
		);
		$cats = wp_list_pluck(get_terms(array( 
			'taxonomy' => 'category'
		)), 'name', 'term_id');
		$category_options = $category_options + $cats;
		?>
		<option selected disabled hidden>انتخاب دسته بندی</option>
		<?php
		foreach($category_options as $value => $label) {
			echo '<option '.selected($_GET['filter_category'], $value).' value="' . esc_attr($value) . '">' . esc_html($label) . '</option>';
		}
	?>   
</select>
<input type="submit" value="فیلتر کن !">
</form>

و کار تموم میشه.

نقل قول

آیدی این دسته ها رو دستی وارد کنم؟؟

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

نه احتیاجی نیست آیدی دسته ها رو دستی وارد کنید.

به کدی که برای فرانت اِند نوشتم توجه کنید و سعی کنید ازش الگو برداری کنید.

 

موفق باشید

1

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


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

سلام

برای این کار باید دو تا متغییر به کوئری های وردپرس اضافه کنید.

..

ممنونم. عالی بود واقعا.

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

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

تشکر فراوان

0

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


لینک به پست
نقل قول

ممنونم.

خواهش میکنم.

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

$cats = wp_list_pluck(get_terms(array( 
	'taxonomy' => 'category'
)), 'name', 'term_id');

به

$cats = wp_list_pluck(get_terms(array( 
	'taxonomy' => 'category',
	'hide_empty' => false
)), 'name', 'term_id');

تغییر بدید.

0

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


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

 

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

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

فکر میکنم خیلی ساده تر از اونی باشه که یسری سایت ها آموزش میدن و قضیه رو پیچیدش میکنن.

برای این کار باید یه تاپیک جدید ایجاد کنم؟؟

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

0

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


لینک به پست

این تاپیک رو مشاهده کنید ببینید چیزی دستگیرتون میشه.

 

0

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


لینک به پست

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

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

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

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


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

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

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


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

  • مطالب مشابه

    • توسط maraljoon
      سلام.. وقت بخیر..
      دوستان، همونطور که میدونید تو صفحه فروشگاه ووکامرس گزینه ای سلکت باکسی وجود داره که میشه نمایش محصولات رو بر اساس جدیدترین ها ، محبوبترین ها و ... مرتب سازی کرد..
      مثل تصویری که ضمیمه کردم..
      من تو صفحه اول سایتم بخشی رو از حلقه ووکامرس استفاده کردم برای نمایش جدیدترین محصولات.
      چطور میتونم به این بخش تو صفحه اصلی سایتم اون فیلتر مرتب سازی رو اضافه کنم؟؟
      کدهایی که تو خود ووکامرس پیدا کردم به این شکله:
      <form class="woocommerce-ordering" method="get"> <select name="orderby" class="orderby"> <?php foreach ( $catalog_orderby_options as $id => $name ) : ?> <option value="<?php echo esc_attr( $id ); ?>" <?php selected( $orderby, $id ); ?>><?php echo esc_html( $name ); ?></option> <?php endforeach; ?> </select> <?php wc_query_string_form_fields( null, array( 'orderby', 'submit' ) ); ?> </form> ولی خب تو صفحه اول تو اون بخش مورد نظر که میذارم فقط یک سلکت باکس رو نمایش میده که هیچ مقداری توش نداره.
      ممنون میشم از راهنمایی هاتون..