যদি (has_posts ()) থাকে তবে (have_posts ()) পর্যাপ্ত না হলে আমি কেন রাখব?


22

"লুপ" সম্পর্কে আমার একটি প্রশ্ন আছে।

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<?php endwhile; else: ?>
<p><?php _e('Sorry, no posts matched your criteria.'); ?></p>
<?php endif; ?>

লুপ ওয়ার্ডপ্রেস কোডেক্স পৃষ্ঠা থেকে কোড নেওয়া ।

আমি কেন ifঅংশ নেব ? মনে হচ্ছে যদি whileলুপ থাকে তবে ঠিকঠাক কাজ করে।

ifবিবৃতি না থাকলে কোন ক্ষেত্রে সমস্যা দেখা দেয় ?

সম্পাদন করা

আমি @ চিপের উত্তর গ্রহণ করেছি। তবে সত্যই বলছি আমার কেবল শেষ অংশ দরকার।

আমার প্রশ্ন থেকে আমি কী জানতে চেয়েছিলাম তা এখনই জানি।

ifবিবৃতি কেবল তখনই প্রয়োজন হয়, যদি আপনি কোনও শিরোনাম বা পাদচরণ রাখতে চান যা কেবল একবার লিখতে হবে। আপনি যদি "মোড়ক" ব্যবহার না করেন তবে ifবিবৃতি আবশ্যক নয়।


2
আমি_কন্টেন্টটি পড়ার আগেই ভোট দিয়েছি, এই শিরোনামটি সিদ্ধান্ত নিচ্ছে!
brasofilo

দুর্দান্ত (চূড়ান্ত) সম্পাদনা। বেশিরভাগ লোক কখনও এবং অন্যটি ব্যবহার না করে সরাসরি একে অপরের পরে ব্যবহার করে use সম্ভবত অনুলিপি এবং পেস্ট কারণে।
হারবার্ট ভ্যান-ভ্লিয়েট

উত্তর:


29

ওয়ার্ডপ্রেস টেমপ্লেট লোডারটি অনেক পরিস্থিতিতে উপযুক্ত প্রাসঙ্গিক টেম্পলেট ফাইল অন্তর্ভুক্ত করবে, এমনকি যদি সেই প্রসঙ্গে অনুসন্ধানের জন্য কোনও পোস্ট না দেয়। উদাহরণ স্বরূপ:

  • মূল ব্লগ পোস্ট সূচি
  • বিভাগ সংরক্ষণাগার সূচী (বিভাগ বিদ্যমান, কিন্তু কোনও পোস্ট নেই)
  • ট্যাগ সংরক্ষণাগার সূচী (ট্যাগ বিদ্যমান, কিন্তু কোনও পোস্ট নেই)
  • লেখক সংরক্ষণাগার সূচী (লেখকের উপস্থিতি রয়েছে, তবে তার কোনও পোস্ট নেই)
  • অনুসন্ধান ফলাফল সূচি

সুতরাং, এই ক্ষেত্রে, উপযুক্ত টেম্পলেট ফাইলটি লোড হবে, তবে কোনও পোস্ট আউটপুট হবে না, কারণ কোয়েরিতে কোনও পোস্ট দেয় না।

প্রুফ অফ কনসেপ্ট উদাহরণ:

সুতরাং, এই প্রসঙ্গে, টেমপ্লেট ফাইলকে if ( have_posts() )শর্তযুক্ত অন্তর্ভুক্ত করার জন্য এটি দরকারী is

অন্যান্য প্রসঙ্গে, কোয়েরিতে কোনও পোস্ট না দিলে টেমপ্লেট ফাইলটি কখনই লোড হবে না। উদাহরণ স্বরূপ:

  • একক ব্লগ পোস্ট
  • স্থির পৃষ্ঠা

এই প্রসঙ্গে, if ( have_posts() )সম্ভবত অপ্রয়োজনীয়।

সম্পাদন করা

আমি বুঝেছি ক্যোয়ারীটি_পোস্ট () দ্বারা ডাকা হয়েছে, তাই না? এবং যদি (have_posts ()) বিদ্যমান থাকে তবে পোস্ট না থাকলে কোয়েরি কখনই ঘটে না।

কী চলছে তা বোঝার জন্য আপনাকে ওয়ার্ডপ্রেস ক্রিয়াকলাপটি দেখতে হবে । দিয়ে শুরু করা wp_loaded(এবং কিছু পরিষ্কার করার জন্য বাদ দেওয়া):

  • wp_loaded
  • parse_request
  • send_headers
  • parse_query
  • pre_get_posts
  • wp
  • template_redirect
  • get_header
  • wp_head
  • the_post
  • wp_footer

সুতরাং, কি ঘটছে, এবং কোন ক্রমে?

  • ক্যোয়ারীটি আহ্বান করা হয়েছে:
    • parse_query
    • pre_get_posts
    • wp
  • টেমপ্লেটটি নির্বাচিত হয়েছে:
    • template_redirect
  • টেমপ্লেটটি লোড / আউটপুট। নিম্নলিখিত ক্রিয়াকলাপগুলি টেমপ্লেট দ্বারা বরখাস্ত করা হয়েছে :
    • get_header
    • wp_head
    • the_post
    • dynamic_sidebar
    • get_footer
    • wp_footer

সুতরাং, the_postদ্বারা বরখাস্ত করা the_post(), ক্যোরিয়াকে পার্স করার পরে , পোস্টগুলি আনার পরে এবং টেমপ্লেটটি লোড হওয়ার পরে ঘটে ।

আমি খুব কৃতজ্ঞ যে আপনি প্রচুর তথ্য দেন যা আমি জানতাম না, তবে আমি যা চাইছিলাম তা এটি নয়।

ওহ, তবে আমি বিশ্বাস করি যে এটি আপনি যা চেয়েছিলেন ঠিক তেমনই।

আসল প্রশ্নটি: একটি বৈধ কোয়েরি রিটার্ন কী? বিভাগ আর্কাইভ সূচী হিসাবে প্রসঙ্গে, কোয়েরিটি বৈধ, এবং বিভাগের আইডি উপস্থিত থাকলেও বিভাগের টেম্পলেটটি লোড করা হয়, এমনকি যদি এই বিভাগে কোনও পোস্ট বরাদ্দ না থাকে তবেও

কেন? কারণ বিশ্লেষণ করা ক্যোয়ারীটি হ'ল (আইআইআরসি) &cat={ID}- যা কোনও বিভাগের জন্য বরাদ্দকৃত কোনও পোস্ট না থাকলেও এটি একটি বৈধ কোয়েরি , এবং এভাবে পার্সিংয়ের পরে 404-এ ফলাফল আসে না।

সেক্ষেত্রে আপনি একটি বৈধ প্রশ্ন, এবং একটি টেমপ্লেট ফাইল লোড পেয়েছেন তবে কোনও পোস্ট নেই । সুতরাং, if ( have_posts() ), , আসলে হয় প্রাসঙ্গিক। আবার, এখানে একটি উদাহরণ রয়েছে: বিভাগটি বিদ্যমান, তবে কোনও পোস্ট বরাদ্দ করা হয়নি। ক্যাটাগরি টেম্পলেট ফাইলটি if ( have_posts() )ফিরে আসার সাথে লোড হয়false

এটি কোনও পোস্ট ভেরিয়েবল ( &p={ID}) যেমন একক ব্লগ পোস্ট এবং স্থিতিশীল পৃষ্ঠাগুলি অন্তর্ভুক্ত করে এমন প্রশ্নের জন্য সত্য হবে না কারণ পোস্টটি আসলে উপস্থিত থাকবে না এবং যখন বিশ্লেষণ করা হবে তখন কোয়েরিটি কোনও বৈধ অবজেক্টকে ফিরিয়ে দেবে না।

সম্পাদনা 2

যদি আমি যথাযথভাবে বুঝতে পারি যে কোনও বিভাগের টেম্পলেটে (has_posts ()) নেই এবং বিভাগটির কোনও পোস্ট নেই, তবে এটি 404.php ফিরে আসে, যদিও এটি পোস্ট ছাড়াই বিভাগ-নমুনা.পিএফপি হওয়া উচিত। এটা কি সঠিক?

না। মনে রাখবেন: টেমপ্লেটটি নির্বাচিত হয়েছে template_redirect। সুতরাং যদি কোয়েরিটি বৈধ হয়, তবে উপযুক্ত টেম্পলেট ফাইলটি লোড হবে। যদি কোয়েরিটি বৈধ নয়, তবে 404 টেমপ্লেট লোড হবে।

সুতরাং, একবার কোনও টেম্পলেট লোড হয়ে যায় - যেমন বিভাগের টেম্পলেট - একবার লুপ আউটপুট হয়ে গেলে, টেমপ্লেটটি পরিবর্তন হয় না

ক্রমের ক্রমটি আবার দেখুন:

  • parse_query
  • pre_get_posts
  • wp
  • template_redirect- টেমপ্লেট এখানে চয়ন এবং লোড করা হয়। এটি কোনও প্রত্যাবর্তনের টেমপ্লেট পয়েন্ট । এই বিন্দু পরে টেমপ্লেট পরিবর্তন করা যাবে না।
  • ...
  • the_post- লুপ কলের অংশ হিসাবে পোস্টডেটা এখানে সেটআপ করা আছে। এটাকে বলা হয় টেমপ্লেট ভিতরে , এবং টেমপ্লেট পরিবর্তন করে না ক্যোয়ারী বস্তুর পাওয়া তথ্যের উপর ভিত্তি করে

চূড়ান্ত সম্পাদনা

এবং আমি দাবি করছি যে পদগুলির অস্তিত্ব যাচাই করার সময় কেন আমি একই পরীক্ষা দুটি করে চালাব। এটি আমার প্রথম প্রশ্ন থেকেই আমি কেবল এটি সম্পর্কে জিজ্ঞাসা করছি।

এবং তার সাথে, আমি শেষ পর্যন্ত বুঝতে পারি: সব মিলিয়ে আপনার প্রশ্নের ওয়ার্ডপ্রেস , বা ওয়ার্ডপ্রেস লুপের সাথে কোনও সম্পর্ক ছিল না । আপনি শর্তসাপেক্ষে যে কোনও নির্বিচার পিএইচপি whileলুপ মোড়ানো সম্পর্কে জিজ্ঞাসা করছেন যা ifএকই শর্তটি পরীক্ষা করে।

এই প্রশ্নটি ডাব্লুপিএসইয়ের আওতার বাইরে, তবে আমি সংক্ষেপে ব্যাখ্যা করব:

একটি ifশর্তাধীন একটি বাইনারি মূল্যায়ন হল: এটা হয় এর trueবা false, এবং সেখানে কি ঘটছে ভিতরে যে শর্তাধীন এর মৃত্যুদন্ড কার্যকর করা হয় একবার

একটি whileশর্তাধীন একটি হল লুপ : এটা, কিছু বিযুক্ত সময়ের জন্য অবশেষ সত্য পাল্টা কিছু বাছাই উপর ভিত্তি করে; এবং এই শর্তাধীনটির ভিতরে কী ঘটে তা বেশ কয়েকবার কার্যকর করা হয় - কাউন্টারটির প্রতিটি পুনরাবৃত্তির জন্য একবার ।

সুতরাং, আসুন আমরা বলে রাখি যে আপনি যদি জিনিসগুলির তালিকাটি জনবহুল হয় তবে আপনি কোনও আনর্ডারড থাকা তালিকা আউটপুট করতে চান। আপনি যদি একটি whileলুপ ব্যবহার করেন এবং মোড়কটি বাদ দেন তবে ifআপনার মার্কআপটি দেখতে এই রকম হবে:

<ul>
<?php while ( list_of_things() ) : ?>
    <li><?php the_list_item(); ?></li>
<?php endwhile; ?>
</ul>

এবং যদি list_of_things()খালি থাকে তবে রেন্ডার আউটপুটটি হ'ল:

<ul>
</ul>

যা অপ্রয়োজনীয় (এবং অবৈধ) মার্কআপ ছেড়ে দেয়।

তবে আপনি যদি ifশর্তসাপেক্ষ মোড়ক যুক্ত করেন তবে আপনি এটি করতে পারেন:

<?php if ( list_of_things() ) : ?>
    <ul>
    <?php while ( list_of_things() ) : ?>
        <li><?php the_list_item(); ?></li>
    <?php endwhile; ?>
    </ul>
<?php endif; ?>

এবং যদি list_of_things()খালি থাকে তবে কোনও চিহ্নআপ আউটপুট হবে না।

এটি কেবল একটি উদাহরণ। এই ifশর্তসাপেক্ষ মোড়কের জন্য প্রচুর ব্যবহার রয়েছে এবং ifশর্তসাপেক্ষ মোড়ক লুপের চেয়ে সম্পূর্ণ ভিন্ন উদ্দেশ্যে কাজ করে while


2
আমার একক পোস্ট / পৃষ্ঠার টেম্পলেটগুলিতে, দীর্ঘকাল থেকে, আমি কেবলমাত্র এটি অপ্রয়োজনীয় the_post();বলেই ব্যবহার করি while। তথ্যের সম্পূর্ণতার জন্য +1।
গাজাজ্যাপ

@ জিএম সম্ভবত if( have_posts() )বিবৃতিটি সরিয়ে ফেলার অর্থটি বোঝায় (এটি আমি অনুসন্ধান করার চেষ্টা করছি), তবে কেবলমাত্র the_post()একক পৃষ্ঠায় ব্যবহার করবেন না !
সুনায়ত্তসত্ত্ব

@ শিপবেনেট সব বিবেচনা করা হয়েছে, আপনি কি মনে if( have_post() )করেন যে টেমপ্লেট ফাইল single-*.phpএবং page-*.phpটেমপ্লেট ফাইলের প্রসঙ্গে পূর্ণ লুপের আগে শর্তটি সরিয়ে নেওয়া নিরাপদ ?
সুনায়ত্তসত্ত্ব

1
"নিরাপদ" এর এই প্রসঙ্গে আসলেই কোনও নির্দিষ্ট অর্থ নেই।
চিপ বেনেট

10

চিপের উত্তরের উন্নতি করা সত্যিই অসম্ভব, তবে কেবল তাড়া করতে গেলে:

কোনও পোস্ট নেইif যখন আপনি কিছু আলাদা শো করতে চান অংশটি ব্যবহার করুন । এটি বিশেষত কার্যকর, উদাহরণস্বরূপ, তারিখ বা বিভাগের সংরক্ষণাগার পৃষ্ঠায়। যদি কেউ এমন কোনও পৃষ্ঠায় নেভিগেট করে যার কোনও পোস্ট নেই, তবে কোনও বার্তা পাওয়া ঠিক নয়, ঠিক তেমন কিছু দেখা যায় না, কারণ লুপটি কখনই কার্যকর হয় না।

if ( have_posts() ):
  // Yep, we have posts, so let's loop through them.
  while ( have_posts() ) : the_post();
  // do your loop
  endwhile;
else :
  // No, we don't have any posts, so maybe we display a nice message
  echo "<p class='no-posts'>" . __( "Sorry, there are no posts at this time." ) . "</p>";
endif;

এবং এটি সবার জানা দরকার।
হারবার্ট ভ্যান-ভিলেট 21

0

কিছু বিবেচনা থাকতে পারে যা এখন পর্যন্ত উত্তরগুলিতে অন্তর্ভুক্ত করা হয়নি। এটি বিবৃতি বাদ দিতে প্রস্তাব দেওয়া হয় না।

যদি বিবৃতিটি সাধারণত ব্যবহৃত হয়:

  • আউটপুট এমন কিছু no posts foundনির্দেশ করতে চাইছে যে প্রশ্নে বিভাগে এর কোনও নিবন্ধ বরাদ্দ করা হয়নি।
  • এইচটিএমএল (যেমন একটি উল এর মতো) এর নিবন্ধের আগে এবং পরে আউটপুট হওয়া উচিত কিনা তা সিদ্ধান্ত নিতে।

নতুন হুক যুক্ত হলে কী হবে?

যদি বিবৃতিটি ব্যবহার না করার আরেকটি সম্ভাব্য সমস্যা হ'ল যদি ওয়ার্ডপ্রেস টিম কোনও নতুন হুক যুক্ত করার সিদ্ধান্ত নিয়েছিল যা প্রথম $wp_query->have_posts()কলটিতে ট্রিগার করে , এটি ভুল সময়ে ট্রিগার করবে। এবং যদি এটি অপ্রত্যাশিত আচরণের কারণ হয় তবে অনুমিতটি সঠিকভাবে অনুসরণ না করার জন্য এটি আপনার দোষ হবে।

অন্যান্য দেবগণ ওয়ার্ডপ্রেস লুপের জন্য একটি নির্দিষ্ট কাঠামো দেখার আশা করছেন see

আমি মনে করি অন্যান্য বিকাশকারীরা পুরো ওয়ার্ডপ্রেস লুপটি দেখতে আশা করছেন। সুতরাং সম্ভবত এটি একটি বিবৃতি যে সেখানে নেই তা অনুসন্ধান করা তাদের পক্ষে খারাপ ধারণা।


-1

আমি এটিকে নিয়ন্ত্রণ কাঠামোর তত্ত্বের মৌলিক প্রশ্ন হিসাবে দেখছি। লুপের মধ্যে বদ্ধ ব্লকটি যদি শর্ত (has_posts ()) প্রথমবার মিথ্যা হিসাবে মূল্যায়ন করে তবে একবারে কার্যকর করা হয় না।

সুতরাং, if ( have_posts() )ওয়ার্ডপ্রেস লুপের উদ্দেশ্যটি শুধুমাত্র শর্তটি মূল্যায়নের আগে একবার have_posts () ফাংশনটি সম্পাদন করা। যদি have_posts()কোনও পার্শ্ব-প্রতিক্রিয়া না if ( have_posts() )থাকে তবে তা সম্পূর্ণ অর্থহীন। যদি এর have_posts()পার্শ্ব-প্রতিক্রিয়া থাকে তবে আপনি নীচের হিসাবে সহজ করতে পারবেন:

<?php have_posts(); ?>
<?php while ( have_posts() ) : the_post(); ?>
<?php endwhile; else: ?>
<p><?php _e('Sorry, no posts matched your criteria.'); ?></p>
<?php endif; ?>

3
সরলীকরণটি অবৈধ পিএইচপি, আপনার অন্য একটি বিবৃতি রয়েছে যা বিবৃতিতে কোনও সংযুক্ত নেই।
সর্বোপরি

1
ifকারণ আছে elseএটা পরে। অন্য কোন কারণ নেই। যদি কোনও পোস্ট না থাকে তবে একটি সুন্দর "পোস্ট নেই" বার্তা প্রদর্শন করা কিছুই না দেখানোর চেয়ে ভাল।
অটো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.