شیء query_posts قسمت اول

خب در این مقاله میخواهیم در مورد تابع query_posts که میشه گفت کاملترین تابع (یعنی یه جورایی پر امکانات ترین) وردپرس هست صحبت کنیم.

وردپرس به نظر من انعطاف پذیرترین سی ام اسی هست که خود من شناختم یعنی حداقل از جوملا، دروپال، نیوک و … خیلی انعطاف پذیرتر هست، البته نمیخوایم دوستانی که از سی ام اس های دیگر استفاده می کنند ناراحت بشند، این نظر شخصی من هست و به هیچ وجه تغییر داده نمیشه.

شاید همین ابتدا بپرسید query_posts چیست؟

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

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

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


            <?php while (have_posts()) : the_post(); ?>

                        <?php the_title(); ?>

            <?php endwhile; ?>

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

اگر این کد رو تست کنید، البته اگر خواستید این کارو بکنید در فایل index.php این تست رو انجام بدید، می بینید که پشت سر هم عنواین چندین پست آخر رو به نمایش میگذاره، اگر هم در تنظیمات وردپرستون گفته باشید که در هر صفحه ده مطلب نشون بده، این کد عنوان ده مطلب آخر رو نشون میده.

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

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

خب اگر بخواهیم کد بالا رو به حالت کوئری پست در بیاریم یه چیزی میشه شبیه کد زیر:


            <?php query_posts( ); ?>

            <?php while (have_posts()) : the_post(); ?>

                        <?php the_title(); ?>

            <?php endwhile; ?>

            <?php wp_reset_query(); ?>

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

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

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

فقط قبل از شروع با خاطر اینکه کار ما فقط با query_posts (خط اول) هست فقط خط اول رو می نویسیم.

خب اگر بخواهیم کدمون رو تغییر بدیم و با query_posts کاری کنیم که به جای 10 پست (پیشفرض تنظیمات وردپرس) تعدادی که ما می خواهیم رو نشون بده خط اولرو به صورت زیر در می آوریم:


            <?php query_posts('posts_per_page=2' ); ?>

            <?php while (have_posts()) : the_post(); ?>

                        <br><?php the_title(); ?>

            <?php endwhile; ?>

            <?php wp_reset_query(); ?>

خب اگر به خط اول دقت کنید متوجه posts_per_page شده اید که مقدارش 5 هست، یعنی این که به جای پیش فرض وردپرس 5 مطلب نشون بده.

مورد بعدی وضعیت پست هست در حالت کلی مطالب وردپرس سه حالت میتونند داشته باشند، اولی منتشر شده (publish) ، دومی پیش نویس (draft) و سومی برای بازبینی (pending) هست، حالا حلقه وردپرس فقط مطالبی که منتشر شده اند رو نمایش میده یا به عبارت دیگه فقط مطالبی که وضعیتشون publish هست رو نشون میده، حالا اگر بخواهید کاری کنید که هر سه حالت رو نشون بده باید پست کوئریتون به شکل زیر باشه:

<?php
query_posts(  array('posts_per_page'
=> 2,'post_status' => array('publish','draft','pending')  )  );
?>

خب اگر دقت کنید حالت نوشتن امکانات در داخل پست کوئری یه مقدار تغییر کرده، اگر کمی پی اچ پی کار کرده باشید باید بدونید که به حالت آرایه ای در اومده.
تقریبا سه حالت برای نوشتن امکانات در داخل پست کوئری وجود داره،

  نحوه نمایش هر تعداد پست در حلقه وردپرس

اولی به صورت زیر هست:

<?php
query_posts( 'posts_per_page=5&post_status=pending'  ); ?>

که توی این حالت تمام موارد بین کوتیشن قرار میگیرند و با & جدا میشند، به کد بالا یک نگاهی بندازید متوجه می شوید. این حالت یک سری محدودیت داره و توی این مقاله ما کمتر از این حالت استفاده می کنیم.

حالت دوم به این صورت هست:

<?php
query_posts( array( 'posts_per_page' => 5, 'post_status' => 'pending'
)  ); ?>

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

حالت سوم هم اینه که ما داخل کوئری پست میگیم که امکانات رو از درون یک متغیر (نیاز به یادگیری موارد ابتدایی پی اچ پی هست) بخونه که ما قبلا تعریفش کرده ایم به صورت زیر:


            <?php

            $args = array(

            'posts_per_page'
=> 5,

            'post_status'
=> 'pending',

            );

            ?>

            <?php query_posts( $args  ); ?>

            

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

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

تا اینجا گفتیم که با کوئری پست تعداد مطالب قابل نمایش رو تغییر دادیم همچنین کمی از وضعیت نوشته گفتیم و گفتیم که هر نوشته توی وردپرس سه حالت کلی داره و حلقه وردپرس به صورت عادی فقط مطالبی که وضعیت اونها publish هست منتشرشده) رو نشون میده البته اگر میخواهید وضعیت یک نوشته رو با استفاده از کد به دست بیارید از کد زیر استفاده کنید:

<?php
get_post_status( 'آي دي نوشته اينجا'
) ?>

خب در دو حالت دیگه یا pending (برای بازبینی) هستند و یا draft (پیشنویس).

اگر بخواهید با استفاده از پست کوئری 5 مطلب نشون بدید اونم با هر وضعیتی (یعنی هر سه حالت) باید از کدی مثل کد زیر استفاده کنید:

<?php
query_posts( array(   'posts_per_page'
=> 5,   'post_status' =>
array('publish', 'pending', 'draft'),   )  ); ?>

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

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

خب مورد بعدی موضوع (دسته) نوشته هست، حالا ما میخواهیم 5 نوشته از یک دسته خاص به نمایش بگذاریم، اینجا باید با ID های دسته کار کنیم، قبلا در همیار در مورد به دست آوردن آی دی یک موضوع گفته شده و مطمئنا برای به دست آوردن آی دی دسته مشکلی نخواهید داشت.

به هر حال اگر بخواهید 5 مطلب فقط از دسته ای که آی دی اون مثلا 3 هست به نمایش بگذارید باید پست کوئریتون به شکل زیر باشه:

<?php
query_posts('cat=3&posts_per_page=5'); ?>

خب نکته ای که اینجا داره اینه که شاید شما احتیاج داشته باشید تا یک دسته رو محروم کنید یا اصطلاحا exclude کنیدش یعنی کاری کنید که تمام مطالب نشون داده بشند به جز دسته ای که شما محرومش کرده اید، برای اینکار فقط کافیه قبل از عدد آی دی اون دسته یک علامت – قرار بدید یعنی کد بالا به صورت زیر میشه:

<?php
query_posts('cat=-3&posts_per_page=5'); ?>
آیا این مقاله برای شما مفید بود؟
تقریبا
خیر

دیدگاهتان را بنویسید

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

دیدگاه‌های این نوشته جدید ترین ها شاخص

  1. یه گزاره از این مقاله رو دوست نداشتم:
    “خب شاید کمی خسته شده باشید، به هر حال مجبور به ادامه آموزش هستیم.”

    برعکس داشام از این آموزش لذت میبردم _ عالی بود عالیی :)))))

  2. سلام من همیشه از مطالب این سایت استفاده می کنم .خیلی عالی هستند. فقط یک سوال یک تابع مثل بالا که لیست پست تایپ product را برمی گردونه عدد posts_per_page=-1 تنظیم کردم تا همه را نشون بده و این در حالی هست که بیشتر از 1000 محصول در سایت ثبت شده.الان دیگه سایت بالا نمیاد و خطا می ده که کش و حافظه زیاد درگیر شده . به نظرتون چه اقدامی بکنم؟

    • 1- با استفاده از FTP فایل مربوط به قالبتون رو ویرایش کنید و نرمال سازی کد رو انجام بدید
      2- منتظر بمونید تا پردازش داخل سرور به اتمام برسه تا سایت بالا بیاد، اگر از هاست اشتراکی استفاده میکنید و مدت زمان درست شدنش طول کشیده تیکت بزنید به مسئولان هاستینگ و ازشون بخواید که با متوقف کردن سرویس ها یا پروسس ها کمکتون کنن(که احتمالا هم جریمه میشید :> )

  3. 9 سال عضو همیار وردپرس

    سلام و خسته نباشد
    1) میخواستم بدونم این دو نقطه جز سینتکس وردپرس هست؟ و باید باشه ؟ یا باید به جای اون ” } ” بزاریم؟ چون توی زبان php بعد while آکولاد باز و بسته قرار داره.
    php while (have_posts()) : the_post()

    2) ‘posts_per_page’ و ‘post_status’ جزء کلمات کلیدی وردپرس هست یا جزء توابع اون هست ؟ اینو متوجه نشدم.

    تشکر

  4. ممنون از مطالب مفیدتون
    ببخشید گفتید حلقه query_posts کاملترین و پرامکانات ترین حلقه وردپرس هست؟؟؟
    فکرکنم از حلقه wp_query چشم پوشی کردین اره؟ آخه امکانات این حلقه هزار برابر اونه
    ممنون میشم توضیح بدین مرسی

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

    • 10 سال عضو همیار وردپرس

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

    • سلام.ببینید فرض کنید من توی یک بلاک دارم شش خبر آخر ارسالی رو نمایش میدم که آخرین خبر هم بصورت ویژه داره نمایش داده میشه.من نمیخام اون خبر آخری که ویژه و بولد هم داره نمایش داده میشه توی شش خبر آخر نمایش داده بشه. و شش خبر آخر منهای آخرین خبر ارسالی میخام توی اون بلاک نمایش داده بشه.

    • 10 سال عضو همیار وردپرس

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

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