ඔබ WP_Query එදිරිව විමසුම්_පොස්ට් () එදිරිව get_posts () භාවිතා කළ යුත්තේ කවදාද?


Answers:


675
  • query_posts()පිටුවක ප්‍රධාන විමසුම නව විමසුමේ නව අවස්ථාවකින් ප්‍රතිස්ථාපනය කිරීමෙන් එය වෙනස් කිරීම සඳහා ඕනෑවට වඩා සරල හා ගැටළු සහගත ක්‍රමයකි. එය අකාර්යක්ෂමයි (SQL විමසුම් නැවත ක්‍රියාත්මක කරයි) සහ සමහර තත්වයන් තුළ එය සම්පූර්ණයෙන්ම අසාර්ථක වනු ඇත (විශේෂයෙන් බොහෝ විට තනතුරු පේජින් සමඟ කටයුතු කිරීමේදී). ඕනෑම නවීන WP කේතයක් pre_get_postsමේ සඳහා කොක්ක භාවිතා කිරීම වැනි වඩාත් විශ්වාසදායක ක්‍රම භාවිතා කළ යුතුය . TL; DR කිසි විටෙකත් query_posts () භාවිතා නොකරන්න .

  • get_posts() භාවිතයේ ඉතා සමාන වන අතර එකම තර්ක පිළිගනී (විවිධ පෙරනිමි වැනි සමහර සූක්ෂ්මතාවයන් සහිතව), නමුත් පෝස්ට් සමූහයක් ලබා දෙයි, ගෝලීය විචල්‍යයන් වෙනස් නොකරයි, ඕනෑම තැනක භාවිතා කිරීමට ආරක්ෂිත වේ.

  • WP_Queryතිරය ​​පිටුපස බලගන්වන පන්තියයි, නමුත් ඔබට ඔබේම අවස්ථාව නිර්මාණය කර වැඩ කළ හැකිය. ටිකක් සංකීර්ණ, අඩු සීමාවන්, ඕනෑම තැනක භාවිතා කිරීමට ආරක්ෂිතයි.


9
jjjeaton query_posts()යනු කුඩා එතීමේ කාර්යයකි WP_Query, එය කරන එකම අමතර දෙය (ගැලීම් $wp_query
සටහනට

8
jjeaton query_posts()සමඟ ප්‍රතිස්ථාපනය කිරීමෙන් WP_Queryකාර්ය සාධනයේ කිසිදු වෙනසක් සිදු නොවනු ඇත, මුල් පිටුවේ විමසුම තවමත් ක්‍රියාත්මක වන්නේ එය මූලික බරෙහි කොටසක් වන බැවිනි. ඔබගේ සැකිලි ගොනුවට කිසිසේත්ම ලූපයක් නොතිබුණද එම විමසුම් ක්‍රියාත්මක වේ.
Rarst

118
ඩබ්ලිව්පීඑස්ඊ හි වඩාත්ම අව්‍යාජ හා උසස් තනතුර මෙය යන හැඟීමෙන් මිදිය නොහැක. කෝඩෙක්ස් හි ද තිබිය යුතුය.
කයිසර්

8
"Query_posts ()" නිකුතුව පිළිබඳ මගේ පැහැදිලි විස්තරය මම එක් කරන්නෙමි: අච්චු ගොනුවක් තුළ query_posts () හෝ WP_Query භාවිතා කිරීම එකම කාර්ය සාධන පිරිවැයක් දරයි: ඔබ දැන් කළ විමසුම. කෝඩෙක්ස් ලිපියේ සාකච්ඡා කර ඇති ගැටළුව නම්, ඔබට ඇත්ත වශයෙන්ම විමසුම ප්‍රතිස්ථාපනය කිරීමට අවශ්‍ය නම්, ඔබ කළ යුත්තේ මුල් විමසුම්_පොස්ට් () 'parse_query' පෙරණය සමඟ පෙරීමෙනි. ඒ ආකාරයෙන් ඔබ සතුව ඇත්තේ අමුතු ලෙස ප්‍රතිස්ථාපනය කිරීම සඳහා දෙවන විමසුමක් කරනවාට වඩා, මුල්, ප්‍රිය විමසුමකි. query_posts () කිසි විටෙකත් නැත !! කවදාවත්!
ජර්ක්ලාර්ක්

22
මෙම සියලු පිළිතුරු ජලයෙන් ඉවතට විසි කරන සංවර්ධක.වර්ඩ්ප්‍රෙස්.කොම් බ්ලොග් අඩවියේ ජෝන් ජේම්ස් ජේකොබි විසින් ලියන ලද විමසුම්_පොස්ට් පිළිබඳ විස්මයජනක පැහැදිලි කිරීමක් තිබේ. ප්රධාන කරුණ: query_postsනැත වෙනස් සියලු දී ප්රධාන පුඩුවක්, එය විස්ථාපනය එය පසු එය දැනටමත් ක්රියාත්මක කර ඇත. ප්‍රධාන ලූපය වෙනස් කිරීමට හොඳම ක්‍රමය pre_get_postsපෙරනයක් හරහා ය . developper.wordpress.com/2012/05/14/…
ඩෑන් ගේල්

72

query_posts- ඔබ කිසි විටෙකත් භාවිතා නොකළ යුතුය query_posts. Ar රාර්ස්ට් පවසා ඇති දේ හැරුණු විට, ඇත්ත වශයෙන්ම විශාල ගැටළුව query_postsවන්නේ, එය ප්‍රධාන විමසුම් වස්තුව බිඳ දමයි (ගබඩා කර ඇත $wp_query). ප්ලගීන සහ අභිරුචි කේත විශාල ප්‍රමාණයක් ප්‍රධාන විමසුම් වස්තුව මත රඳා පවතී, එබැවින් ප්‍රධාන විමසුම් වස්තුව බිඳ දැමීම යන්නෙන් අදහස් වන්නේ ඔබ ප්ලගීන සහ අභිරුචි කේත වල ක්‍රියාකාරිත්වය බිඳ දමමින් සිටින බවයි. එවැනි එක් කාර්යයක් පමණක් වැදගත් pagination ශ්‍රිතය වේ, එබැවින් ඔබ ප්‍රධාන විමසුම බිඳ දැමුවහොත්, ඔබ pagination බිඳ දමයි.

කොතරම් නරකදැයි ඔප්පු කිරීමට query_posts, ඕනෑම අච්චුවක, පහත සඳහන් දේ කර ප්‍රති .ල සංසන්දනය කරන්න

var_dump( $wp_query );
query_posts( '&posts_per_page=-1' );
var_dump( $wp_query );

get_postsසහ ද්විතීයික විමසුම් ( අදාළ ලිපි, ස්ලයිඩර්, විශේෂාංග අන්තර්ගතය සහ ස්ථිතික මුල් පිටුවල අන්තර්ගතය වැනි ) WP_Queryසෑදීම සඳහා නිවැරදි ක්‍රමය වේ . එය සටහන් කළ යුතුය, ඔබ මුල් පිටුවේ, තනි පිටුවේ හෝ ඕනෑම ආකාරයක සංරක්ෂිත පිටුවක ප්‍රධාන විමසුමට පක්ෂව කිසිවක් භාවිතා නොකළ යුතුය. ඔබට ප්‍රධාන විමසුම වෙනස් කිරීමට අවශ්‍ය නම්, එසේ කිරීමට භාවිතා කරන්න, අභිරුචි විමසුමක් නොවේ. ( යාවත්කාලීන කිරීම: ස්ථිතික මුල් පිටු සහ සත්‍ය පිටු සඳහා, සත්‍ය පිටුවල සහ ස්ථිතික මුල් පිටුවල pre_get_posts භාවිතා කිරීම බලන්න *)pre_get_posts

සාරාංශයක් ලෙස, WP_Queryප්‍රධාන විමසුම මඟින් භාවිතා කරනු ලබන අතර එය ද භාවිතා කරයි get_posts, නමුත් get_posts()භාවිතයන් වුවද WP_Query, වෙනස්කම් කිහිපයක් තිබේ

  • get_postsවඩා වේගවත් WP_Query. ආන්තිකය වෙබ් අඩවියේ මුළු තනතුරු ප්‍රමාණය මත රඳා පවතී. මේ සඳහා හේතුව, ඇත get_postsවෙයි 'no_found_rows' => trueකිරීමට පෙරනිමියෙන් WP_Queryමඟහරියි / නීතිමය පිගත කඩාගෙන යාම. සමඟ 'no_found_rows' => true, WP_Queryවිමසන ලද පෝස්ට් ප්‍රමාණය ලබා ගනී, පසුව ඇප ලබා ගනී, පෙරනිමියෙන්, එය පේජින් ගණනය කිරීම සඳහා විමසුමට ගැලපෙන සියලුම තනතුරු සඳහා තවදුරටත් සොයයි.

    මෙම හේතුව නිසා, get_posts()පේජින් නොවන විමසුම් සඳහා පමණක් භාවිතා කළ යුතුය. පේජින් get_postsකිරීම ඇත්තෙන්ම එක් විශාල අවුලකි. WP_Queryසියලුම පිටු විමසීම් සඳහා භාවිතා කළ යුතුය

  • get_posts()මෙම පෙරහන් මගින් බලපෑමට posts_*ලක්වන පෙරහන් වලට බලපෑම් නොකරයි WP_Query. හේතුව get_posts, පෙරනිමියෙන්, සමත් 'suppress_filters' => trueවීමයිWP_Query

  • get_postsවැනි අමතර පරාමිතික කිහිපයක් ඇත include, exclude, numberpostsහා category. මෙම පරාමිතීන් WP_Queryසම්මත වීමට පෙර වලංගු පරාමිතීන් බවට වෙනස් වේ WP_Query. includeබවට වෙනස් වී යයි post__in, excludeබවට post__not_in, categoryබවට catසහ numberpostsබවට posts_per_page. යන්තම් සටහන, සියලු සම්මත කළ හැකි බව පරාමිතීන් WP_Queryසමඟ වැඩ get_posts, ඔබ හැකි පෙරනිමි පරාමිතීන් භාවිතා නොසලකා නොවget_posts

  • get_postsප්රතිලාභ පමණක් $postsදේපල WP_Queryඅතර WP_Queryසම්පූර්ණ වස්තුව පැමිණේ. මෙම වස්තුව කොන්දේසි, පේජින් කිරීම සහ ලූපය තුළ භාවිතා කළ හැකි වෙනත් ප්‍රයෝජනවත් තොරතුරු සම්බන්ධයෙන් බෙහෙවින් ප්‍රයෝජනවත් වේ.

  • get_postsලූපය භාවිතා නොකරයි, නමුත් සටහන් foreachපෙන්වීමට ලූපයක්. එසේම, පෙරනිමියෙන් අච්චු ටැග් නොමැත. setup_postdata( $post )අච්චු ටැග් ලබා ගැනීමට භාවිතා කළ යුතුය. WP_Queryපුඩුවක් භාවිතා කරන අතර අච්චු ටැග් පෙරනිමියෙන් ලබා ගත හැකිය

  • get_postsවෙයි 'ignore_sticky_posts' => 1කිරීමට WP_Query, ඒ නිසා get_postsපෙරනිමියෙන් ඇලෙන සුළු තනතුරු නොතකා

, ඉහත මත පදනම් භාවිතය යන්න get_postsහෝ WP_Queryඔබ දක්වා වන අතර, ඔබ ඇත්තටම විමසුම සිට අවශ්ය නැත. ඉහත දැක්වෙන්නේ ඔබේ අභිමතය පරිදි ඔබට මග පෙන්විය යුතුය


1
මම කැමතිම පිළිතුරු ලබා ගැනීමට හැකි වේවායි ප්‍රාර්ථනා කරමි. මෙය බොහෝ දේ පැහැදිලි කරයි.
Athoxx

1
විශිෂ්ට පැහැදිලි කිරීමක්! "get_posts () භාවිතා කළ යුත්තේ පේජින් නොවන විමසුම් සඳහා පමණි. Get_posts පේජින් කිරීම සැබවින්ම එක් විශාල අවුලකි. WP_Query සියලු පේජිනේට් විමසුම් සඳහා භාවිතා කළ යුතුය" මූලික වශයෙන් යමෙකු දැනගත යුතු වන්නේ ඉමෝ ය.
බුලියන්

33

මූලික වෙනස වන්නේ query_posts()එය ඇත්ත වශයෙන්ම වත්මන් ලූපය වෙනස් කිරීම සඳහා පමණි. ඔබ අවසන් වූ පසු, ලූපය නැවත සකස් කර එහි ප්‍රීතිමත් මාර්ගයට යැවිය යුතුය. ඔබේ "විමසුම" මූලික වශයෙන් ඔබ ශ්‍රිතයට යොමු කරන URL නූලක් වන නිසා මෙම ක්‍රමය තේරුම් ගැනීමට ටිකක් පහසු වේ:

query_posts('meta_key=color&meta_value=blue'); 

අනෙක් අතට, WP_Queryඑය පොදු අරමුණු සඳහා වන මෙවලමක් වන අතර, එය කෙලින්ම MySQL විමසුම් ලිවීමට සමාන query_posts()ය. ඔබට එය ඕනෑම තැනක භාවිතා කළ හැකිය (ලූපයේ පමණක් නොවේ) සහ එය දැනට ක්‍රියාත්මක වන කිසිදු පශ්චාත් විමසුමකට බාධා නොකරයි.

WP_Queryඑය සිදු වන විට මම බොහෝ විට භාවිතා කිරීමට නැඹුරු වෙමි . ඇත්ත වශයෙන්ම, එය ඔබගේ විශේෂිත නඩුවට පැමිණේ.


16

සරලව භාවිතා කිරීමේ අවශ්‍යතාවයක් නොමැත query_posts(). එය කරන්නේ නව WP_Query වස්තුවක් ස්ථාපනය කර එම නව වස්තුව නැවත පැවරීම පමණි global wp_query.

යොමුව සඳහා, පහත දැක්වෙන්නේ එම සත්‍ය query_posts()ශ්‍රිතයයි.

 function query_posts($query) {
        $GLOBALS['wp_query'] = new WP_Query();
        return $GLOBALS['wp_query']->query($query);
    }

ඔබට ගැඹුරු අභිරුචි විමසුම් ස්ක්‍රිප්ට් එකක් සෑදීමට අවශ්‍ය නම් ඔබේම WP_Query වස්තුව ස්ථාපනය කරන්න. නැතහොත් get_posts()ඔබට කළ යුතු වන්නේ සැහැල්ලු හැසිරවීමක් මෙහි සහ එතැනින් නම් පමණි.

කෙසේ වෙතත්, මම ඔබට නිර්දේශ කරන්නේ ඔබටම උදව්වක් wp_includes/query.phpකර WP_Queryපන්තියට ගොස් පරීක්ෂා කර බලන්න.


15

එය වෙනත් විමසුම් ප්‍රති result ල වලට ද බලපාන බැවින් භාවිතා wp_reset_query()කිරීමෙන් පසු ඔබ භාවිතා කරන බවට වග බලා ගන්න query_posts().


11

මට නිවැරදිව කියවීම මතක නම්, මූලිකවම "ලූපය" WP_Queryමූලික ලිපිගොනු වල සිදු කරයි, නමුත් තේරුම් ගැනීමට පහසු ආකාරයකින්.


8
  • query_posts () : ඔබට ප්‍රධාන විමසුම වෙනස් කිරීමට අවශ්‍ය නම් එක් අවස්ථාවකදී පමණක් භාවිතා කළ හැකිය. එය ගෝලීය විචල්‍යයන් රාශියක් සකසයි;
  • get_posts () : එය යාන්ත්‍ර විද්‍යාවට බෙහෙවින් සමාන වන අතර එකම තර්ක පිළිගනී, නමුත් තනතුරු පෙළ නැවත ලබා දෙයි
  • WP_Query : ඔබට එහි වස්තුවක් නිර්මාණය කර වැඩ කළ හැකිය. වඩා සංකීර්ණ, අඩු සීමාවන්, ඕනෑම තැනක භාවිතා කිරීම ආරක්ෂිතයි.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.