ডাব্লুপি কোয়েরি ব্যবহার করে পিতামাতার সমস্ত উপ পৃষ্ঠাগুলি পান


13

এখানে আমার কোড

$my_wp_query = new WP_Query();
$all_wp_pages = $my_wp_query->query(array('post_type' => 'page','post_parent'=>$parid,'orderby'=>'title','order'=>'ASC' ));

এটি কেবলমাত্র প্রথম স্তরের সাব পৃষ্ঠাগুলি প্রদর্শন করে। আমার সমস্ত উপ পৃষ্ঠাগুলি, সাব এর সাব পৃষ্ঠা ... এবং সমস্ত প্রয়োজন need আমি একটি সমাধান অনুসন্ধান করেছি এবং আমি get_pages এবং wp_list_pages ব্যবহার করে সমস্ত উপ পৃষ্ঠাগুলি পেতে পারি।

তবে আমার কাস্টম পোস্ট মেটা মান অনুসারে অর্ডারটি সত্যই সাজানো দরকার। সুতরাং আমি কাস্টম কোয়েরি ব্যবহার করতে হবে।

সাহায্য করুন. ধন্যবাদ


1
নীচে আপনি বলছেন যে আপনি একটি উত্তর পেয়েছেন, এটি কী?
ড্রু বেকার

4
আপনি get_page_children চেক আউট করেছেন ?
t31os

উত্তর:


6

শুধু ব্যবহার get_pages()করবেন না কেন ?

যেমন

<?php
// Determine parent page ID
$parent_page_id = ( '0' != $post->post_parent ? $post->post_parent : $post->ID );
// Get child pages as array
$page_tree_array = get_pages( array(
    'child_of' => $parent_page_id;
) );
?>

তবে এটি যদি সত্যই WP_Query()অবজেক্ট হিসাবে থাকতে পারে তবে একটি অনুরূপ পদ্ধতি ব্যবহার করুন:

<?php
// Determine parent page ID
$parent_page_id = ( '0' != $post->post_parent ? $post->post_parent : $post->ID );
// Build WP_Query() argument array
$page_tree_query_args = array(
    'post_parent' => $parent_page_id;
);
// Get child pages as a WP_Query() object
$page_tree_query = new WP_Query( $page_tree_query_args );
?>

যদি আমরা get_pages () কার্যকারিতা ব্যবহার করি তবে আমরা কাস্টম ক্ষেত্রগুলির জন্য বাছাই (সাজ্ট_কলাম) প্রয়োগ করতে পারি না। এটি কেবল পোস্ট টেবিল ক্ষেত্রগুলিকে কেবল গ্রহণ করে। আমার কাস্টম ফিল্ডের জন্য বাছাই করা প্রয়োজন। সুতরাং শুধুমাত্র আমি ডাব্লুপি কোয়েরি () ব্যবহার করি। কোন বিকল্প উপায় আছে?
phpuser

আপনি কি আমার উত্তরটির দ্বিতীয়ার্ধটি দেখেছেন, যা আমি ব্যবহার করছি WP_Query()?
চিপ বেনেট

আমি এই কোডটি চেষ্টা করেছিলাম তবে এটি কেবল প্রথম স্তরের সাব পৃষ্ঠাগুলি দেয়। আমার উপ পৃষ্ঠাগুলি প্রয়োজন >> সাব এর সাব >> ইত্যাদি ... (একাধিক নিম্ন স্তরের পৃষ্ঠাগুলি))। অবশেষে আমি সমাধানটি খুঁজে পেলাম। আপনার জবাবের জন্য ধন্যবাদ
phpuser

7
আপনার সমাধান কি !?
JCHASE11

উপরের অ্যারে সংজ্ঞায়নের অভ্যন্তরে কিছু সেমিকোলন রয়েছে যার ফলে সিনট্যাক্স ত্রুটি ঘটে।
ptrin

4

সমস্যাটি

আপনার আঁকড়ে ধরার সমস্যা যা হ'ল "আমি কীভাবে এক্স করব?" এটি 1 পদক্ষেপের ক্রিয়া নয়, এটি একটি মাল্টিস্টেপ প্রক্রিয়া এবং এটি পৃথকীকরণের প্রয়োজন।

আপনার এটি করার দরকার নেই:

get all the posts that are a child of X ordered by meta

আপনার এটি করা দরকার:

get all the posts that are a child of X
    for each child, get all the posts that are a child
        foreach child of that child get all the posts that are a child
            ...
                hmmm we don't have any more children left

Take our list of posts and order them by meta

সাধারণ সমাধান

সুতরাং, হার্ডকডিং না করে আপনি কীভাবে অসীমভাবে এটি শেষ করবেন তা বোঝার জন্য আপনাকে পুনরাবৃত্ত ক্রিয়াকলাপগুলি বুঝতে হবে।

যেমন

function make_zero( $amount ) {
    $amount = $amount - 1;
    if ( $amount > 1 ){
        return make_zero( $amount );
    }
    return $amount;
}

কোনও সমস্যার সমাধানের জন্য পুনরাবৃত্তি প্রয়োগ করা

সুতরাং আপনার পিতামাতা $parid, এবং আপনার পোস্ট মেটার একটি চাবি আছে $metakey

এর বাচ্চাদের ধরার জন্য এটি কোনও ফাংশনে প্রবেশ করতে দিন।

$children = get_children_with_meta( $parid, $metakey );

তারপরে আমরা $ শিশুদের অ্যারে বাছাই করব, কীগুলি পোস্ট আইডি হবে এবং মানগুলি হবে মেটা মান।

asort($children);

এবং ফাংশনটিকে এই হিসাবে সংজ্ঞায়িত করতে দেয়:

function get_children_with_meta( $parent_id, $metakey ) {
    $q = new WP_Query( array( 'post_parent' => $parent_id, 'meta_key' => $metakey ));
    if ( $q->have_posts() ) {
        $children - array();
        while ( $q->have_posts() ) {
            $q->the_post();
            $meta_value = get_post_meta(get_the_ID(), $metakey, true );
            $children[get_the_ID() ] = $meta_value;
        }
        return $children;
    } else {
        // there are no children!!
        return array();
    }
}

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

এখন বাচ্চাদের বাচ্চাদের কী হবে?

আমাদের লুপের মাঝামাঝি সময়ে, আমাদের পিতামাতাদের আইডির চেয়ে সন্তানের মধ্যে পাস করে একটি পুনরাবৃত্ত কল করতে হবে।

সুতরাং এই:

$q->the_post();
$meta_value = get_post_meta(get_the_ID(), $metakey, true );
$children[get_the_ID() ] = $meta_value;

এটি হয়ে:

$q->the_post();
$meta_value = get_post_meta(get_the_ID(), $metakey, true );
$children[get_the_ID() ] = $meta_value;

// now get the childrens children
$grandchildren = get_children_with_meta( get_the_ID(), $metakey );

// merge the grandchildren and the children into the same list
$children = array_merge( $children, $grandchildren );

এই পরিবর্তনের মাধ্যমে ফাংশনটি এখন শিশুদের, শিশুদের শিশুদের, শিশুদের বাচ্চাদের ..... ইত্যাদি পুনরুদ্ধার করে

শেষে আপনি এই জাতীয় আইডি পেতে অ্যারের মানগুলি ছাঁটাই করতে পারেন:

$post_ids = array_keys( $children );
$q = new WP_Query( array( 'post__in' => $post_ids );
// etc

এই কৌশলটি ব্যবহার করে আপনি অন্য কোনও মেট্রিকের সাথে মেটা কী মান প্রতিস্থাপন করতে পারেন, বা অন্য উপায়ে পুনরাবৃত্ত ফাংশন ব্যবহার করতে পারেন।

যেহেতু পুরো কোডটিতে কেবল কয়েক সেকেন্ডের বোধগম্যতা এবং একটি দ্রুত অনুলিপি পেস্ট প্রয়োজন, তাই আমি কোডের সম্পূর্ণ অনুলিপি পেস্ট ব্লক দিয়ে আপনার বুদ্ধিমত্তাকে অপমান করব না।

সুবিধাদি

  • পরিবর্তন সহ যে কোনও পোস্ট ধরণের এবং ডেটা ফর্মের জন্য কাজ করে
  • নেস্টেড মার্কআপ জেনারেট করে সংশোধন করা যায়
  • ফিরে আসা অ্যারেগুলি স্থানান্তরে রেখে সহজেই ক্যাশে করুন
  • শেষ WP_Query এ পেজিং প্রয়োগ করে পেজিংয়ের সাথে সেটআপ করা যেতে পারে

সমস্যাগুলি আপনার মোকাবেলা করবে

  • আপনি যতক্ষণ না পেলেন সেখানে কতগুলি শিশু রয়েছে তা জানার কোনও উপায় আপনার নেই, সুতরাং পারফরম্যান্সের ব্যয় মাপেনি
  • আপনি যা চান তা প্রচুর প্রশ্ন উত্পন্ন করবে এবং এতে জড়িত সম্ভাব্য গভীরতার কারণে স্বভাবগতভাবে ব্যয়বহুল।

আমার সুপারিশ

আমি আপনাকে সুপারিশ করব যাতে হয় আপনার পৃষ্ঠার শ্রেণিবিন্যাস সমতল করুন বা পরিবর্তে একটি শৈলী ব্যবহার করুন। উদাহরণস্বরূপ, আপনি যদি পোস্টগুলি রেটিং করেন তবে 1,2,3,4 এবং 5 পদগুলির সাথে একটি পৃষ্ঠা রেটিং শ্রেণীবদ্ধ করুন This এটি আপনাকে বাক্সের বাইরে পোস্টের তালিকা সরবরাহ করবে।

বিকল্পভাবে, নেভ মেনুগুলি ব্যবহার করুন এবং এই সমস্যাটিকে পুরোপুরি বাইপাস করুন


3

পুনরাবৃত্তভাবে সমস্ত বর্তমান উপ-পৃষ্ঠাগুলি পান

এখানে একটি পুনরাবৃত্ত পদ্ধতির ব্যবহার করা হচ্ছে get_children। আপনার মধ্যে নিম্নলিখিত রাখুন functions.php:

function get_all_subpages($page, $args = '', $output = OBJECT) {
    // Validate 'page' parameter
    if (! is_numeric($page))
        $page = 0;

    // Set up args
    $default_args = array(
        'post_type' => 'page',
    );
    if (empty($args))
        $args = array();
    elseif (! is_array($args))
        if (is_string($args))
            parse_str($args, $args);
        else
            $args = array();
    $args = array_merge($default_args, $args);
    $args['post_parent'] = $page;

    // Validate 'output' parameter
    $valid_output = array(OBJECT, ARRAY_A, ARRAY_N);
    if (! in_array($output, $valid_output))
        $output = OBJECT;

    // Get children
    $subpages = array();
    $children = get_children($args, $output);
    foreach ($children as $child) {
        $subpages[] = $child;

        if (OBJECT === $output)
            $page = $child->ID;
        elseif (ARRAY_A === $output)
            $page = $child['ID'];
        else
            $page = $child[0];

        // Get subpages by recursion
        $subpages = array_merge($subpages, get_all_subpages($page, $args, $output));
    }

    return $subpages;
}

এটি কিভাবে ব্যবহার করতে

আপনি যেখানে চান সেখানে উপরের ফাংশনটি ব্যবহার করুন, উদাহরণস্বরূপ:

$all_current_subpages = get_all_subpages(0);

ফাংশনটি একটি argsপ্যারামিটার (ক্যোয়ারিং স্ট্রিং বা অ্যারে) এবং একটি outputপ্রকার (উপরে দেখুন) সমর্থন করে।

সুতরাং আপনি এটি এর মতো ব্যবহার করতে পারেন:

$args = array(
    'post_status' => 'private',
    'order_by' => 'post_date',
    'order' => 'DESC',
);
$all_current_subpages = get_all_subpages(42, $args, ARRAY_A);

এবং নির্ভরতার কারণে get_children=> get_posts=> WP_Queryআপনি মেটা মানগুলি ব্যবহার করতে পারেন, এই প্রশ্নের লেখকের প্রাথমিকভাবে অনুরোধ হিসাবে।


2

আপনার ঠিক পরে এটি কী আছে তা নিশ্চিত নন তবে আপনি wp_list_pages ফাংশনটি ব্যবহার করতে পারেন এবং 'চাইল্ড_ওফ' এবং 'গভীরতা' পরামিতি ব্যবহার করতে পারেন।

আরও তথ্যের জন্য কোডেক্সে নিম্নলিখিত পৃষ্ঠাটি দেখুন: http://codex.wordpress.org/Function_References/wp_list_pages


2

আমি একটি পুনরাবৃত্ত ফাংশন করেছি যা পিতামাতার পৃষ্ঠার সমস্ত শিশুদের আইডিতে পেয়ে যায়। আমাদের আইডির পরে, আমরা পৃষ্ঠাগুলির জন্য ক্যোয়ারী তৈরি করি এবং মেটা কী / মান অনুসারে ফলাফল অর্ডার করতে পারি।

// Gets all the children ids of post_parent
function _get_children_ids( $post_parent ) {
    $results = new WP_Query( array(
        'post_type' => 'page',
        'post_parent' => $post_parent
    ) );

    $child_ids = array();
    if ( $results->found_posts > 0 )
        foreach ( $results->posts as $post ) // add each child id to array
            $child_ids[] = $post->ID;

    if ( ! empty( $child_ids ) )
        foreach ( $child_ids as $child_id ) // add further children to array
            $child_ids = array_merge( $child_ids, _get_children_ids( $child_id ) );

    return $child_ids;
}

$children_ids = _get_children_ids( 9 ); // use your numeric page id or get_the_id()

$results = new WP_Query( array(
    'post_type'   => 'page',
    'post__in'   => $children_ids
    #'meta_key'   => 'meta_key', // your meta key
    #'orderby'    => 'meta_key',
    /* 'meta_query' => array( // optional meta_query
        array(
            'key' => 'meta_key', // key
            'value' => array(3, 4), // values
            'compare' => 'IN', // operator
        )
    ) */
) );

var_dump( $results );

আপনার যদি বাচ্চাদের একটি শ্রেণিবৃদ্ধিক পদ্ধতিতে মেটা কী / মান অনুসারে বাছাই করতে হয় তবে আপনার মেটা_কি এবং অর্ডার_ব্যাপিগুলি _ge_children_ids ফাংশনে (চূড়ান্ত WP_Query এর পরিবর্তে) ডব্লিউপি_কিউয়ারিতে পাস করতে হবে।

যদি তা না হয় তবে সমস্ত শিশু আইডি পাওয়ার একটি সহজ পদ্ধতি হ'ল:

$children = get_pages( 'child_of=9');

$children_ids = array();
if ( ! empty( $children ) )
    foreach ( $children as $post )
        $children_ids[] = $post->ID;

-1

আমি এই কাজটি করছি, কেবল আপনার পৃষ্ঠায় কোডটি আটকে দিন। পিএইচপি ফাইল

//REDIRECT TO FIRST CHILD FROM PARENT PAGE

// Build WP_Query() argument array
$page_tree_query_args = array(
    'post_parent' => $post -> ID,
    'post_type' => 'page',
    'order' => 'asc'
);
// Get child pages as a WP_Query() object
$page_tree_query = new WP_Query( $page_tree_query_args );
if(!empty($page_tree_query -> posts)){
    $first_subpage = $page_tree_query -> posts[0] -> ID;
    wp_redirect( get_permalink( $first_subpage ) );
    exit;   
}

এটি ক) কাজ করছে না ( $post -> ID?), খ) যা চাওয়া হয়েছিল তা নয়, গ) খুব ভালভাবে ব্যাখ্যা করা হয়নি।
tfrommen
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.