এই কাস্টম থিমটিতে মূল ক্যোয়ারী এবং কাস্টম ক্যোয়ারী কীভাবে কাজ করে সে সম্পর্কে কিছু সন্দেহ?


20

আমি ওয়ার্ডপ্রেস থিম বিকাশে বেশ নতুন এবং আমি পিএইচপি তে আসছি না (আমি জাভা এবং সি # থেকে এসেছি) এবং এই কাস্টম থিমটিতে নিম্নলিখিত পরিস্থিতি রয়েছে

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

এটি করতে আমি এই কোডটি ব্যবহার করি:

<section id="blog-posts">

<header class="header-sezione">
        <h2>Articoli in evidenza</h2>
</header>

<!--<?php query_posts('tag=featured');?>-->

<?php
    $featured = new WP_Query('tag=featured');

    if ($featured->have_posts()) : 
            while ($featured->have_posts()) : $featured->the_post();
            /*
             * Include the post format-specific template for the content. If you want to
             * use this in a child theme, then include a file called called content-___.php
             * (where ___ is the post format) and that will be used instead.
             */
                 get_template_part('content', get_post_format());

             endwhile;
        wp_reset_postdata();
    else :
        // If no content, include the "No posts found" template.
        get_template_part('content', 'none');

    endif;
    ?>


<header class="header-sezione">
    <h2>Ultimi Articoli</h2>
</header>

<?php
// get the term using the slug and the tag taxonomy
$term = get_term_by( 'slug', 'featured', 'post_tag' );
// pass the term_id to tag__not_in
query_posts( array( 'tag__not_in' => array ( $term->term_id )));
?>

<?php
    if (have_posts()) :
        // Start the Loop.
        while (have_posts()) : the_post();

            /*
             * Include the post format-specific template for the content. If you want to
             * use this in a child theme, then include a file called called content-___.php
             * (where ___ is the post format) and that will be used instead.
             */
            get_template_part('content', get_post_format());

        endwhile;
    else :
        // If no content, include the "No posts found" template.
        get_template_part('content', 'none');

    endif;
    ?>

</section>

এটি দুর্দান্ত কাজ করে, তবে এই সমাধানটির গুণমান এবং এটি ঠিক কীভাবে কাজ করে সে সম্পর্কে আমার কিছু সন্দেহ আছে doubts

সমস্ত বৈশিষ্ট্যযুক্ত পোস্ট নির্বাচন করতে , আমি এই লাইনটি ব্যবহার করি যা একটি নতুন WP_Queryঅবজেক্ট তৈরি করে যা নির্দিষ্ট ট্যাগযুক্ত কোয়েরিকে সংজ্ঞায়িত করে featured:

$featured = new WP_Query('tag=featured');

তারপরে আমি এর have_posts()পদ্ধতিটি ব্যবহার করে এই ক্যোয়ারির ফলাফলটিতে পুনরাবৃত্তি করি ।

সুতরাং, আমি যা বুঝতে পেরেছি, এটি ওয়ার্ডপ্রেস মূল ক্যোয়ারী নয়, এটি আমার তৈরি একটি নতুন ক্যোয়ারী। আমি যা বুঝতে পেরেছি তা থেকে আরও ভাল একটি নতুন ক্যোয়ারী তৈরি করা (যেমনটি হয়েছে) এবং যখন আমি এই ধরণের ক্রিয়াকলাপ করতে চাই তখন মূল ক্যোয়ারীটি ব্যবহার না করা।

এটা কি সত্য, নাকি আমি কিছু মিস করছি? যদি এটি সত্য হয় তবে আপনি কি আমাকে ব্যাখ্যা করতে পারেন, কেন নতুন কাস্টম ক্যোয়ারী তৈরি করা ভাল এবং ওয়ার্ডপ্রেসের মূল কোয়েরিটি সংশোধন না করা কেন ভাল?

ঠিক আছে, চলছে। আমি সমস্ত পোস্ট দেখাই যেগুলিতে 'বৈশিষ্ট্যযুক্ত' ট্যাগ নেই। এটি করার জন্য, আমি এই কোড স্নিপেট ব্যবহার করি, যা বিপরীতে, মূল ক্যোয়ারীটি সংশোধন করে:

    <?php
    // get the term using the slug and the tag taxonomy
    $term = get_term_by( 'slug', 'featured', 'post_tag' );
    // pass the term_id to tag__not_in
    query_posts( array( 'tag__not_in' => array ( $term->term_id )));
    ?>

    <?php
        if (have_posts()) :
            // Start the Loop.
            while (have_posts()) : the_post();
                get_template_part('content', get_post_format());

            endwhile;
        else :
            // If no content, include the "No posts found" template.
            get_template_part('content', 'none');

        endif;
        ?>

সুতরাং আমি মনে করি, এটি বেশ ভয়ঙ্কর। এটা সত্যি?

হালনাগাদ:

একই অপারেশন আমি এই ফাংশন (নীচে মহান উত্তর) পাওয়া গেছে যে আমি যুক্ত করেছেন কাজের জন্য থিমের functions.php

function exclude_featured_tag( $query ) {
    if ( $query->is_home() && $query->is_main_query() ) {
        $query->set( 'tag__not_in', 'array(ID OF THE FEATURED TAG)' );
    }
}
add_action( 'pre_get_posts', 'exclude_featured_tag' );

এই ফাংশনে একটি হুক রয়েছে যা ক্যোয়ারী ভেরিয়েবল অবজেক্ট তৈরি হওয়ার পরে ডাকা হয়, তবে আসল কোয়েরি চালানোর আগে।

সুতরাং, আমি যা বুঝতে পেরেছি সেগুলি থেকে ইনপুট প্যারামিটার হিসাবে এটি একটি ক্যোয়ারী অবজেক্ট নেয় এবং নির্দিষ্ট ট্যাগ বাদে সমস্ত পোস্ট নির্বাচন করে এটি পরিবর্তন করে (আসলে ফিল্টার করে) (আমার ক্ষেত্রে featuredট্যাগ পোস্টগুলি)

সুতরাং, আমি কীভাবে আমার থিমের বৈশিষ্ট্যযুক্ত নয় এমন পোস্টগুলি দেখানোর জন্য এই ফাংশনটির সাথে পূর্ববর্তী ক্যোয়ারী (বৈশিষ্ট্যযুক্ত পোস্টগুলি দেখানোর জন্য ব্যবহৃত এক) ব্যবহার করতে পারি? বা আমার কি নতুন কোয়েরি তৈরি করতে হবে?

উত্তর:


33

আপনার আসল প্রশ্নটি মূলত কখন কাস্টম ক্যোয়ারী চালানো যায় এবং কখন মূল প্রশ্নের সাথে ব্যবহার করা যায়। এটিকে তিন ভাগে ভাঙতে দেয়

প্রথম অংশ

কখন কাস্টম ক্যোয়ারী চালাবেন (এটি কোনও চূড়ান্ত তালিকা নয়)

  • কাস্টম সামগ্রী স্লাইডার তৈরি করতে

  • একটি পৃষ্ঠায় একটি বৈশিষ্ট্যযুক্ত সামগ্রী অঞ্চল তৈরি করতে

  • পেজ.এফপি টেম্পলেটগুলিতে আপনার পোস্টগুলি প্রদর্শন করতে হবে

  • আপনার যদি স্ট্যাটিক প্রথম পৃষ্ঠায় কাস্টম সামগ্রী প্রয়োজন হয়

  • সম্পর্কিত সম্পর্কিত, জনপ্রিয় বা তথ্যমূলক পোস্ট প্রদর্শন করুন

  • মূল ক্যোয়ারির স্কোপের বাইরে অন্য কোনও মাধ্যমিক বা পরিপূরক সামগ্রী

মূল ক্যোয়ারীটি কখন ব্যবহার করবেন।

এতে প্রাথমিক সামগ্রী প্রদর্শিত হবে

  • আপনার হোমপেজে এবং পৃষ্ঠাটি ব্যাকএন্ডে একটি ব্লগপেজ হিসাবে সেট করেছে

  • সমস্ত সংরক্ষণাগার পৃষ্ঠাগুলি যা আর্কাইভ.এফপি, বিভাগ.এফপি, লেখক.এফপি, ট্যাক্সনোমি.পিপি, ট্যাগ.পিএফপি এবং তারিখ.এফপি এর মতো টেম্পলেট অন্তর্ভুক্ত করে

  • আপডেট: সত্য পৃষ্ঠাগুলিতে এবং একটি স্ট্যাটিক প্রথম পৃষ্ঠায় কাস্টম সামগ্রী প্রদর্শন করুন ( সত্য পৃষ্ঠাগুলি এবং স্থির সম্মুখ পৃষ্ঠায় pre_get_posts ব্যবহার করে দেখুন )

অংশ দুই

সমস্ত বৈশিষ্ট্যযুক্ত পোস্টগুলি নির্বাচন করতে আমি এই লাইনটি ব্যবহার করি যা একটি নতুন ডাব্লুপি_কিউয়ারি আইটেম তৈরি করে যা নির্দিষ্ট ট্যাগযুক্ত কোয়েরিকে সংজ্ঞায়িত করে:

সুতরাং, আমি যা বুঝতে পেরেছি তা থেকে এটি ওয়ার্ডপ্রেস মূল কোয়েরি নয় তবে এটি আমার তৈরি একটি নতুন ক্যোয়ারী। আমি যা বুঝতে পেরেছি তা থেকে এটি একটি নতুন ক্যোয়ারী তৈরি করা ভাল (যেমন হয়েছে) এবং যখন আমি এই ধরণের ক্রিয়াকলাপ সম্পাদন করতে চাই তখন মূল ক্যোয়ারি ব্যবহার না করা

সঠিক। এটি মূল প্রশ্নের জন্য সুযোগের বাইরে চলে যায়। এটি গৌণ বা পরিপূরক সামগ্রী যা মূল ক্যোয়ারী দিয়ে তৈরি করা যায় না। আপনি আপনার কাস্টম ক্যোয়ারী তৈরি করতে বা সর্বদা ব্যবহার করা উচিতWP_Queryget_posts

query_postsকাস্টম অনুসন্ধান, বা অন্য কোনও কোয়েরি তৈরি করতে কখনও ব্যবহার করুন । আমার জোর।

দ্রষ্টব্য: এই ফাংশনটি প্লাগইন বা থিম দ্বারা ব্যবহৃত হতে বোঝানো হয়নি। পরে ব্যাখ্যা হিসাবে, মূল ক্যোয়ারী পরিবর্তন করার জন্য আরও ভাল, আরও পারফরম্যান্ট বিকল্প রয়েছে। ক্যোয়ারী_পোস্টগুলি () একটি পৃষ্ঠার মূল ক্যোয়ারীটিকে কোয়েরির নতুন উদাহরণ দিয়ে প্রতিস্থাপনের মাধ্যমে অতিরিক্ত সরল এবং সমস্যাযুক্ত উপায়। এটি অদক্ষ (আবার এসকিউএল কোয়েরিগুলি চালায়) এবং কিছু পরিস্থিতিতে সম্পূর্ণ ব্যর্থ হবে (বিশেষত প্রায়শই পোস্ট পৃষ্ঠাগুলি নিয়ে কাজ করার সময়)।

সরানো

ঠিক আছে, আমি যাচ্ছি এমন সমস্ত পোস্ট দেখাই যা বৈশিষ্ট্যযুক্ত ট্যাগ নেই, এটি করার জন্য আমি এই কোড স্নিপেট ব্যবহার করি যা বিপরীতে মূল ক্যোয়ারীটি সংশোধন করে:

query_posts( array( 'tag__not_in' => array ( $term->term_id )));

সুতরাং আমি মনে করি এটি অত্যন্ত ভয়ঙ্কর। এটা সত্যি?

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

এটি আপনার প্রাথমিক বিষয়বস্তু, সুতরাং আপনার ডিফল্ট লুপের সাথে মূল ক্যোয়ারীটি ব্যবহার করা উচিত, যা দেখতে এটির মতো হওয়া উচিত এবং আপনার যা দরকার তা এটিই is

<?php
    if (have_posts()) :
        // Start the Loop.
        while (have_posts()) : the_post();

            get_template_part('content', get_post_format());

        endwhile;
    else :
        // If no content, include the "No posts found" template.
        get_template_part('content', 'none');

    endif;
?>

আপনি এই অংশটি সম্পূর্ণরূপে মুক্ত করতে পারেন, এটি মুছতে পারেন, এটি পোড়াতে এবং এটি ভুলে যেতে পারেন

<?
// get the term using the slug and the tag taxonomy
$term = get_term_by( 'slug', 'featured', 'post_tag' );
// pass the term_id to tag__not_in
query_posts( array( 'tag__not_in' => array ( $term->term_id )));
?>

ঠিক আছে, একবার আপনি এটি করে নিলে, আপনি দেখতে পাবেন যে বৈশিষ্ট্য ট্যাগ থেকে পোস্টগুলি আপনার হোম পৃষ্ঠায় মূল ক্যোয়ারী এবং ডিফল্ট লুপ ব্যবহার করে উপস্থিত হবে।

হোমপেজ থেকে এই ট্যাগটি সরানোর সঠিক উপায়টি রয়েছে pre_get_posts। এটি আপনার প্রধান বিষয়বস্তু লুপে পরিবর্তন আনতে সর্বদা ব্যবহার করা উচিত মূল ক্যোয়ারী এবং হুকটি পরিবর্তনের উপযুক্ত উপায়

সুতরাং, সহ কোডটি pre_get_postsসঠিক এবং এটি সেই ফাংশন যা আপনার ব্যবহার করা উচিত। কেবল একটি জিনিস, সর্বদা একটি চেক করুন যে আপনি কোনও প্রশাসক পৃষ্ঠায় নেই কারণ pre_get_postsপিছনের প্রান্তটিও পরিবর্তিত হয়। সুতরাং হোমপেজ থেকে বৈশিষ্ট্যযুক্তfunctions.php ট্যাগগুলি মুছে ফেলার জন্য এটি ব্যবহার করার উপযুক্ত কোড

add_action( 'pre_get_posts', 'exclude_featured_tag' );
function exclude_featured_tag( $query ) 
{
    if (    !is_admin() 
         && $query->is_home() 
         && $query->is_main_query() 
    ) {
        $query->set( 'tag__not_in', [ID OF THE FEATURED TAG] );
    }
}

তৃতীয় অংশ

অতিরিক্ত পড়ার উপাদান যা ভবিষ্যতে সহায়ক হবে


আমার আনন্দ. আপনি এটি দরকারী বলে খুশি। এনজু :-)
পিটার গুসেন

বাহ, বেশ উত্তর! যদিও আমি তথ্যের একটি সমালোচনা টুকরা মিস করছি: আমি কীভাবে ডব্লিউপিকে প্রধান পোস্ট পৃষ্ঠাগুলির পাশাপাশি "এটি একটি পোস্ট পৃষ্ঠা" বলব ? ধরা যাক আমি 10,11,12 বিভাগযুক্ত পোস্টগুলির একটি তালিকা এবং 13,14,15 বিভাগ সহ অন্য একটি তালিকা চাই। আমি দেখতে পাচ্ছি যে কীভাবে আমি প্রধান ক্যোয়ারিতে বিভাগগুলি ইনজেক্ট করতে pre_get_posts ব্যবহার করতে পারি, তবে আমি ডাব্লুপি কে কীভাবে সঠিক পৃষ্ঠাভুক্তি সহ পোস্টগুলির তালিকা হিসাবে রেন্ডার করতে পারি? এটির পৃষ্ঠাগুলি বলে আমি কি এখানে সত্যিই আপনার বিস্তৃত উত্তরটি অনুসরণ করতে পারি? ওয়ার্ডপ্রেস.স্ট্যাকেক্সচেঞ্জ / এ / 215027/74134 ? নিশ্চয় ওয়ার্ডপ্রেস স্থানীয়ভাবে একাধিক ব্লগ তালিকার অনুমতি দেয়?
মার্ক বেরি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.