رفتن به مطلب

ساخت فیلتر مرتب سازی ایجکسی برای پست تایپ خاص


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

درود مجدد

 

بخوام به طور کلی بگم آرگومان کلاس WP_Query برای دریافت پست هایی که در پست تایپ design هستند و دارای یک متا با نام test هستن این شکلی میشه:

$args = array(
	'posts_per_page' => 10,
	'post_status' => 'publish',
	'ignore_sticky_posts' => 1,
	'post_type' => 'design',
	'meta_key' => 'test'
);

 

لینک به ارسال
در در 12/6/2017 at 20:28، mehran-b گفته است :

حلقه وردپرس بر اساس یک meta_key خاص رو توی پاسخ های قبلیم در تاپیک های دیگر گفتم.

سلام.

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

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

اگه وقتشو داشتین ممنون میشم تو این مورد هم کمکم کنید.

تشکر

لینک به ارسال
در در 12/7/2017 at 11:14، mehran-b گفته است :

درود مجدد

 

بخوام به طور کلی بگم آرگومان کلاس WP_Query برای دریافت پست هایی که در پست تایپ design هستند و دارای یک متا با نام test هستن این شکلی میشه:


$args = array(
	'posts_per_page' => 10,
	'post_status' => 'publish',
	'ignore_sticky_posts' => 1,
	'post_type' => 'design',
	'meta_key' => 'test'
);

 

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

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

مثل سلکت کدی زیر:

<?php
$terms = get_terms(array(
	'taxonomy' => 'design',
    'hide_empty' => false
));
if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){
    echo '<div class="design-main">';
 
    foreach ( $terms as $term ) {
		echo ' <label class="control-label" for="inputdesign">paper</label>
      <select class="paper clearfix" id="inputdesign"></select>
	  
	  <label class="control-label glass" for="inputLocation"> glass </label>
	  
	    <select name="filter_design" id="inputLocation for="radio'.$term->term_id.'">
		 <option value="">-</option>'.$terms = get_the_terms($post->ID, 'design').' 
		<option value="'.$term->term_id.'" selected="selected" '.$term->term_id.'" value="'.$term->term_id.'">'.$term->name.'</option></select>';
	  
	  
    }
    echo '</div>';
  
}
?>

 

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

پوزش. منظورتون رو از ساختار متوجه نشدم

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

لینک به ارسال
در هم اکنون، mehran-b گفته است :

 

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

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

<?php

function set_post_views( $postID ) 
{
    $count_key = 'the_views';
    $count = get_post_meta($postID, $count_key, true);
    if($count==''){
        $count = 0;
        // delete old 'the_views' value.
        delete_post_meta( $postID, $count_key );
        // add new 'the_views' value.
        add_post_meta( $postID, $count_key, '0' );
    } else {
        $count++;
        // update old 'the_views' value.
        update_post_meta( $postID, $count_key, $count );
    }
}

function get_post_views( $postID )
{
    $count_key = 'the_views';
    $count = get_post_meta( $postID, $count_key, true );
    if($count=='') {
        // delete old 'the_views' value.
        delete_post_meta( $postID, $count_key );
        // add new 'the_views' value.
        add_post_meta( $postID, $count_key, '0' );

        return "0 بازدید";
    }

    return $count.'بازدید';
}

 

لینک به ارسال

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

من میخوام بدوم اون مقدارهای meta_key مربوطه چیه که میخواید توی سلکت باکس لیست بشه؟

بعد سلکت باکسی هم که ساخته میشه اصلا داینامیک نیست یعنی باید option ها رو که همون meta_value هست خودتون براش تعریف کنید.

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

 

تشکر

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

فعلا اعداد رو بصورت پیشفرض نذاشتم.

ولی اگه پیشفرض باشه یک سلکت باکس بجای حالت فعلی تو کاستوم فیلد تعریف میکنم و چند تا عدد بهش میدم. 10 - 15 - 20 - 50

در صورتی که پیشفرض این اعداد رو تعریف کنم چطور میشه برای اون فیلتر تعریف کرد تا این اعداد رو نمایش بده و با انتخاب هر کدوم صفحه بصورت ایجکس مطالبی رو نشون بده بر اساس اون option انتخاب شده. مثلا عدد 10

و اگه این اعداد رو بصورت پیشفرض تعریف نکنم هم این امکان وجود داره؟ که خودش اعدادی که تو اون متاکی ثبت میشه رو لیست کنه؟

ویرایش شده توسط maraljoon
لینک به ارسال

درود مجدد

 

یه سلکت باکس استاتیک داریم:

<select name="filter_meta">
		<option selected disabled hidden>انتخاب دسته بندی</option>
		<?php
		$meta_value = array(10, 15, 20, 50);
		foreach($meta_value as $value) {
			echo '<option '.selected($_GET['filter_meta'], $value).' value="' . esc_attr($value) . '">' . esc_html($value) . '</option>';
		}
	?>  
</select>

کد مربوط به AJAX این میشه:

<script>
  $(document).ready(function(){
    $('select[name="filter_meta"]').change(function(){
      $.ajax({
        type : "GET",
        url : "<?php echo home_url('/'); ?>",
        data : {
          do : 'filtermeta',
          mymeta : $(this).val()
        },
        beforeSend : function() {
          $("#loading").fadeIn(); // show loading
        },
        success : function(response) {
          $('#result').html(response); // change result
          $("#loading").fadeOut(); // hide loading
        }
      });
    });
  });
</script>

کد فانکشن این میشه:

add_action('template_redirect', function() {
    if(isset($_GET['do']) && $_GET['do'] == "filtermeta") {
		add_filter('template_include', function() {
            return get_template_directory() . '/filtermeta.php';
        });
    }
});

کد فایل filtermeta.php هم این میشه:

$meta = $_GET['mymeta'];
$args = array(
	'posts_per_page' => 10,
	'post_status' => 'publish',
	'ignore_sticky_posts' => 1,
	'post_type' => 'design'
	'meta_key' => 'test',
	'meta_value' => $meta
);
$myposts = new WP_Query($args);
if(!$myposts->have_posts()) {
	echo "پستی وجود ندارد";
	exit;
}
while ( $myposts->have_posts() ) {
  $myposts->the_post(); ?>
	<div class="col-md-3 col-sm-3 col-xs-3 clearfix">
		<div class="box">
			<div class="image clearfix">
				<?php the_post_thumbnail(''); ?>
			</div>
			<h2 class="posttitle"><?php the_title(); ?></h2>
		</div>
	</div>
<?php }
wp_reset_postdata();

 

 

موفق باشید

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

 

سلام.

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

خیلی خیلی سپاسگزارم.

پوزش. میشه option هر سلکت باکس دو تا عدد گذاشت که مثلا 1 تا 5  صفحه   6 تا 10 صفحه

وقتی روی اولی کلیک میشه مواردی رو نشون بده که از 1 تا 5 توشون ثبت شده.

ممکنه یه مطلب عدد 1 براش ثبت شده باشه. یکی عدد2 . یکی دیگه عدد 5 و ..

ویرایش شده توسط maraljoon
لینک به ارسال

درود مجدد

 

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

 

کد مربوط به ایجاد سلکت باکستون:

<select name="filter_meta">
		<option selected disabled hidden>انتخاب دسته بندی</option>
		<?php
		$meta_value = array('1-5', '6-10', 10);
		foreach($meta_value as $value) {
			echo '<option '.selected($_GET['filter_meta'], $value).' value="' . esc_attr($value) . '">' . esc_html($value) . '</option>';
		}
	?>  
</select>

کد مربوط به فایل filtermeta.php :

<?php

$meta = $_GET['mymeta'];
$args = array(
	'posts_per_page' => 10,
	'post_status' => 'publish',
	'ignore_sticky_posts' => 1,
	'post_type' => 'design'
);
$meta_key = "test";
if(is_numeric($meta)) {
	$args = array_merge($args, array(
		'meta_key' => $meta_key,
		'meta_value' => $meta
	));
} else {
	$meta_values = array_map('intval', array_map('trim', explode("-", $meta)));
	$range = range(min($meta_values), max($meta_values));
	$strval = array_map('strval', $range);
	$meta_query = array(
		'meta_query' => array(
		
		)
	);
	foreach($strval as $nmeta) {
		
		$meta_query['meta_query'] = array_merge($meta_query['meta_query'], array(
			array(
				'key' => $meta_key,
				'value' => $nmeta
			)
		));
		
	}
	if(count($meta_query['meta_query']) > 1)
		$meta_query['meta_query'] = array_merge($meta_query['meta_query'], array(
			'relation' => 'AND'
		));
	$args = array_merge($args, $meta_query);
}
$myposts = new WP_Query($args);
if(!$myposts->have_posts()) {
	echo "پستی وجود ندارد";
	exit;
}
while ( $myposts->have_posts() ) {
  $myposts->the_post(); ?>
	<div class="col-md-3 col-sm-3 col-xs-3 clearfix">
		<div class="box">
			<div class="image clearfix">
				<?php the_post_thumbnail(''); ?>
			</div>
			<h2 class="posttitle"><?php the_title(); ?></h2>
		</div>
	</div>
<?php }
wp_reset_postdata();

سایر کدها تغییری نخواهد داشت.

 

موفق باشید

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

 

سلام.. ممنونم.

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

لینک به ارسال

کوئری تولید شده توسط کد درسته ولی میشه اینم تست کرد.

<?php

$meta = $_GET['mymeta'];
$args = array(
	'posts_per_page' => 10,
	'post_status' => 'publish',
	'ignore_sticky_posts' => 1,
	'post_type' => 'design'
);
$meta_key = "test";
if(is_numeric($meta)) {
	$args = array_merge($args, array(
		'meta_key' => $meta_key,
		'meta_value' => $meta
	));
} else {
	$meta_values = array_map('intval', array_map('trim', explode("-", $meta)));
	$range = range($meta_values[0], $meta_values[1]);
	$meta_query = array(
		'meta_query' => array(
		
		)
	);
	foreach($range as $nmeta) {
		
		$meta_query['meta_query'] = array_merge($meta_query['meta_query'], array(
			array(
				'key' => $meta_key,
				'meta_value_num' => $nmeta,
				'meta_compare' => '='
			)
		));
		
	}
	if(count($meta_query['meta_query']) > 1)
		$meta_query['meta_query'] = array_merge($meta_query['meta_query'], array(
			'relation' => 'AND'
		));
	$args = array_merge($args, $meta_query);
}
$myposts = new WP_Query($args);
if(!$myposts->have_posts()) {
	echo "پستی وجود ندارد";
	exit;
}
while ( $myposts->have_posts() ) {
  $myposts->the_post(); ?>
	<div class="col-md-3 col-sm-3 col-xs-3 clearfix">
		<div class="box">
			<div class="image clearfix">
				<?php the_post_thumbnail(''); ?>
			</div>
			<h2 class="posttitle"><?php the_title(); ?></h2>
		</div>
	</div>
<?php }
wp_reset_postdata();

 

موفق باشید

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

 

تشکر

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

میگم شاید مشکل از این باشه که داریم توی آپشن دو عدد میاریم. میشه بجاش دو تا سلکت باکس گذاشت و مثلا یکری اعدا 1 تا 5 رو توی سلکت باکس اولی و 5 تا 10 رو تو سلکت باکس بعدی گذاشت. یعنی هر آپشن یک عدد توش باشه که با انتخاب آپشن تو سلکت باکس اول و دوم بر اساس این سرچ کنه.

 

لینک به ارسال

من امکان تست خروجی ندارم.

نقل قول

میگم شاید مشکل از این باشه که داریم توی آپشن دو عدد میاریم. میشه بجاش دو تا سلکت باکس گذاشت و مثلا یکری اعدا 1 تا 5 رو توی سلکت باکس اولی و 5 تا 10 رو تو سلکت باکس بعدی گذاشت. یعنی هر آپشن یک عدد توش باشه که با انتخاب آپشن تو سلکت باکس اول و دوم بر اساس این سرچ کنه.

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

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

من امکان تست خروجی ندارم.

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

در واقع کدی که نوشتید میاد از بین مطالب اون مواردی رو نشون میده که تو سلکت باکس انتخاب شده؟ درسته؟ فرضا اگه تو مطلبی عدد1 رو تو اون زمینه دلخواه انتخاب و منتشر کرده باشیم وقتی با انتخاب گزینه 1- تا 5 توی سلکت باکس فیلتر برامون این مطلب که زمینه دلخوه عدد1 براش ثبت شده نمایش داده میشه؟؟

لینک به ارسال

وقتی شما 1 تا 5 رو انتخاب میکنی میاد تمامی پست هایی که توی پست تایپ design هستن و متای کی test اشون مقدار 1 یا 2 یا 3 یا 4 یا 5 داره رو لیست میکنه.

نکته شما متغییر $meta_key رو با کلید متای خودتون جایگزین نکردید مقدارش رو.

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

 

چرا. جایگزین کردم. منظورتون همون test هست دیگه؟ کلید متای خوم رو گذاشتم جای test.

تو کد زیر برای سلکت باکسی که ساختیم اون عدد 10 برای چیه؟ چرا مثل دو تای دیگه بین دو عدد نیست؟

<select name="filter_meta">
		<option selected disabled hidden>انتخاب دسته بندی</option>
		<?php
		$meta_value = array('1-5', '6-10', 10);
		foreach($meta_value as $value) {
			echo '<option '.selected($_GET['filter_meta'], $value).' value="' . esc_attr($value) . '">' . esc_html($value) . '</option>';
		}
	?>  
</select>
ویرایش شده توسط maraljoon
لینک به ارسال

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

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

<select name="filter_meta">
		<option selected disabled hidden>انتخاب دسته بندی</option>
		<?php
		$meta_value = array('1-5', '6-10', '10');
		foreach($meta_value as $value) {
			echo '<option '.selected($_GET['filter_meta'], $value).' value="' . esc_attr($value) . '">' . esc_html($value) . '</option>';
		}
	?>  
</select>

 

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

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

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

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

 

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

تو این بخش از کد $meta = $_GET['mymeta'];

mymeta رو خوتون تعریف کردین یا اینکه متغیر ثابتی هست؟ اگه نیاز باشه از این کد استفاده بشه برای کلید متاهای دیگه باید تغییر کنه؟

ویرایش شده توسط maraljoon
لینک به ارسال
در 5 ساعت قبل، maraljoon گفته است :

تو این بخش از کد $meta = $_GET['mymeta'];

mymeta رو خوتون تعریف کردین یا اینکه متغیر ثابتی هست؟ اگه نیاز باشه از این کد استفاده بشه برای کلید متاهای دیگه باید تغییر کنه؟

این mymeta رو احتیاجی نیست تغییر بدید.

لینک به ارسال
در در 12/12/2017 at 21:06، mehran-b گفته است :

 

سلام مجدد.

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

فکر میکنم کدی که میذارم درست نیست و کار خاصی انجام نمیده.

<form  method="get">

  <button name="filter_view" type="submit" value="HTML">مرتب سازی بر اساس پربازدیدترین</button>

</form>

 

لینک به ارسال

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

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

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

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

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

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

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

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

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