رفتن به مطلب

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


پست های پیشنهاد شده

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

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

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

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

تشکر فراوان

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

لینک به ارسال

سلام

 

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

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

لینک به ارسال
در 12 ساعت قبل، 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>

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

ویرایش شده توسط mehran-b
لینک به ارسال
در در 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>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

 

لینک به ارسال
نقل قول

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

خواهش میکنم.

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

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

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

خواهش میکنم.

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

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

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

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

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

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

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

 

لینک به ارسال

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

 

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

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
لینک به ارسال
در 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
لینک به ارسال

سلام مجدد

 

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

برای این چیزی که شما میخواید باید کوئری رزرو شده 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>

 

موفق باشید

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

سلام مجدد

.........

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

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

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

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

به این شکل:

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

 

لینک به ارسال
در 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>

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

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

لینک به ارسال

سلام

 

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

برای شروع با استفاده از فیلتر 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>

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

نقل قول

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

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

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

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

 

موفق باشید

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

سلام

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

..

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

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

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

تشکر فراوان

لینک به ارسال
نقل قول

ممنونم.

خواهش میکنم.

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

$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');

تغییر بدید.

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

 

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

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

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

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

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

لینک به ارسال
  • 1 ماه بعد...
در در 9/23/2017 at 18:28، mehran-b گفته است :

 

سلام.

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

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

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

 

لینک به ارسال

سلام و درود

 

بنابر سایر کامنت های این تاپیکم باید عمل کنید.

 

بک اِند

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

add_action('pre_get_posts', function ($query) {
    if($query->is_home() && $query->is_main_query()) {
		if(get_query_var('filter_id', false)) {
			if(get_post_status((int) get_query_var('filter_id')) !== false && is_numeric(get_query_var('filter_id'))) {
				$query->set('ignore_sticky_posts', 1);
				$query->set('post__in', array((int) get_query_var('filter_id')));
			}
		}
    }
});

فرانت اِند

<form method="get" dir="rtl">
	<input type="text" name="filter_id">
	<input type="submit" value="فیلتر کن !">
</form>

 

موفق باشید

لینک به ارسال

به گفتگو بپیوندید

هم اکنون می توانید مطلب خود را ارسال نمایید و بعداً ثبت نام کنید. اگر حساب کاربری دارید، برای ارسال با حساب کاربری خود اکنون وارد شوید .

مهمان
ارسال پاسخ به این موضوع ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از 75 اموجی مجاز می باشد.

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

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.

×
×
  • اضافه کردن...