رفتن به مطلب

مشکل نمایش لیست کاربران بر اساس امتیاز


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

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

به مشکلی بر خوردم

من از کد زیر برای نمایش لیست 5 کاربر برتر سایت بر اساس امتیاز آنها استفاده میکنم


<?php foreach ( get_users('&orderby=user_point &number=5') as $user ) : ?>
<li><a><?php echo $user->display_name; ?>   امتیاز : (<?php $get_user_point = get_user_point($user->ID);?><?php echo $get_user_point; ?>)</a></li>

<?php endforeach; ?>

اما کد به درستی عمل نمیکند و کاربران را مرتب نشان نمیدهد به این صورت که کاربری که امتیاز بیشتر را دارد در اول لیست قرار نمیگیرد و در هر صورت مدیر سایت در اول لیست قرار میگیرد با اینکه امتیاز کمتری دارد به شکل زیر :

2j8kk6wdo7ulq58wur6k.png

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

با تشکر

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

خوب برای اینکه نمی تونید به این ترتیب سورت بگیرید

برای سورت گرفتن اول باید مقدار user_point را در یک متای کاربری ذخیره کنید و بعد ضمن اینکه نام متا را در کوئری بیارید مقدار orderby را هم meta_value بگذارید

امتیاز دهیتون بر اساس آموزش همین سایته؟

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

  • امتیاز 1
لینک به ارسال

این کد را تست کنید :


<?php
global $user_ID;
$get_user_point = get_user_point($user->ID);
if(is_user_logged_in() and $get_user_point>0) {
remove_user_meta($user_ID, 'user_point');
add_user_meta($user_ID, 'user_point', $get_user_point, false);
//1
$user_point = get_user_meta($user_ID, 'user_point', true);
//echo $user_point;
//2
}
?>
<?php foreach ( get_users('meta_name=user_point&orderby=meta_value&number=5') as $user ) : ?>
<li><a><?php echo $user->display_name; ?>   امتیاز : (<?php echo $user_point; ?>)</a></li>
<?php endforeach; ?>

  • امتیاز 1
لینک به ارسال

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

کد را تست کردم از این لاین اشکال گرفت و قالب به درستی بارگذاری نشد:

remove_user_meta($user_ID, 'user_point');

به این صورت هست ارور:

<b>Fatal error</b>: Call to undefined function remove_user_meta() in <b>

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

خوب پس این مراحل را انجام بدید

1. یک قالب برگه با کدهای زیر بسازید



<?php
/*
template name: points
*/?>
<!DOCTYPE html>
<html dir="rtl">

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" >
<title></title>
</head>

<body>
<?php
$args = array (
'order' => 'DESC',
'orderby' => 'post_count',
);

$user_query = new WP_User_Query( $args );

if ( ! empty( $user_query->results ) ) {
echo '<ul>';
foreach ( $user_query->results as $user ) {
$point = get_user_point($user->ID);
if(get_user_meta($user->ID, 'user_point')) {
update_user_meta($user->ID, 'user_point', $point);
}
else {
add_user_meta($user->ID, 'user_point', $point);
}
?>
<li><a href="<?php echo home_url('/?author='.$user->ID);?>"><?php echo $user->display_name; ?>  <small> امتیاز : (<?php echo get_user_meta($user->ID, 'user_point', true); ?>)</small></a></li>
<?php
}
echo '</ul>';
echo 'ok';
}
else {
echo 'Not found';
}

$args = array (
'number' => '5',
'order' => 'DESC',
'meta_key' => 'user_point',
'meta_type' => 'NUMERIC',
'orderby' => 'meta_value',
);

// The User Query
$user_query = new WP_User_Query( $args );

// The User Loop
if ( ! empty( $user_query->results ) ) {
echo '<ol>';
foreach ( $user_query->results as $user ) { ?>
<li><a href="<?php echo home_url('/?author='.$user->ID);?>"><?php echo $user->display_name; ?>   امتیاز : (<?php echo get_user_meta($user->ID, 'user_point', true); ?>)</a></li>
<?php }
echo '</ol>';
}
?>
<style type="text/css">
body {
counter-reset:olli;
}
ul,ol,li {
padding:0;
margin:0;
}

li {
display:inline-block;
width:30%;
}
ol li {
counter-increment:olli;
}
ol li:before {
content:counter(olli)'.';
}
</style>
</body>

</html>

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

برای اینکه توی مصرف منابع به مشکل نخورید پیشنهاد می کنم هر چند روز یکبار مثلا ده روز یکبار همین برگه را یکبار لود کنید تا امتیاز ها به روز شود و الا این کد را هم به header.php اضافه کنید


<?php
global $user_ID;
if(is_user_logged_in()) :
$point = get_user_point($user_ID);
if(get_user_meta($user_ID, 'user_point')) {
update_user_meta($user_ID, 'user_point', $point);
}
else {
add_user_meta($user_ID, 'user_point', $point);
}
endif;
?>

و این کوئری را هم در محل نمایش


<?php
$args = array (
'number' => '5',
'order' => 'DESC',
'meta_key' => 'user_point',
'meta_type' => 'NUMERIC',
'orderby' => 'meta_value',
);
$user_query = new WP_User_Query( $args );
if ( ! empty( $user_query->results ) ) {
echo '<ul>';
foreach ( $user_query->results as $user ) { ?>
<li><a href="<?php echo home_url('/?author='.$user->ID);?>"><?php echo $user->display_name; ?>   امتیاز : (<?php echo get_user_meta($user->ID, 'user_point', true); ?>)</a></li>
<?php }
echo '</ul>';
}
?>

  • امتیاز 3
لینک به ارسال

خیلی خیلی ممنونم استاد, مشکل حل شد.امیدوارم تو تمام مراحل زندگی موفق و پیروز باشید.

فقط یک مورد:

همانطور که شما عرض کردید برای اینکه اطلاعات بروز بشه باید برگه رو لود کنم در غیر اینصورت اون کد رو به فایل

header.php اضافه کنم.

من اون کد رو به فایل

header.php اضافه کردم تا نیازی به لود برگه نباشه ولی عمل نمیکنه و باز هم باید برگه رو لود کنم تا اطلاعات بروز بشه

مشکل مهم و خاصی نیست ولی اگر امکان بروز رسانی اطلاعات به صورت خودکار بود خیلی بهتر میشد

ولی

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

براتون آروزی موفقیت دارم

ویرایش شده توسط graphicno
  • امتیاز 2
لینک به ارسال

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

وقتی یکبار برگه را لود کنید اطلاعات همه به روز می شه مسلما امتیاز بعدی را کاربر وقتی می گیره که دوباره وارد سایت بشه مطلبی بگذاره یا نظری بده که در این صورت هم با هدر به روز می شه و الا که امتیازش تغییری نکرده و امتیاز قبلی براش باید اعمال بشه که می شه

  • امتیاز 1
لینک به ارسال

لطفا برای ارسال دیدگاه وارد شوید

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



ورود به حساب کاربری
×
×
  • اضافه کردن...