আপনি ডিফল্ট হোম পৃষ্ঠা হিসাবে সিপিটি কীভাবে ব্যবহার করবেন?


20

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

বাস্তবে, হোম পৃষ্ঠাটি ওয়ার্ডপ্রেসের মধ্যে নির্দিষ্ট "পৃষ্ঠাগুলি" একটি স্ট্যাক হবে। মূলত, এর জন্য পৃষ্ঠাগুলি থাকবে: ইন্ট্রো , ব্লগ , আমাদের সম্পর্কে , পোর্টফোলিও এবং আমাদের সাথে যোগাযোগ করুন । এগুলি সমস্ত একে অপরের উপরে সজ্জিত করা হবে যাতে আপনি এক পৃষ্ঠা থেকে অন্য পৃষ্ঠায় স্ক্রোল করতে পারেন।

আমার প্রথম প্রবৃত্তিটি কেবলমাত্র একটি পৃষ্ঠা ( হোম নামে পরিচিত ) ব্যবহার করা এবং একটি শর্টকোড এম্বেড করা ছিল যা পৃষ্ঠা স্লাগগুলি গ্রহণ করে এবং যথাযথ ক্রম (যেমন [pageOrder]intro, blog, about-us, portfolio, contact-us[/pageOrder]) আউটপুট করে । জিনিসগুলি আউট করা, লুপটি নিয়ন্ত্রণ করতে এবং পৃষ্ঠার বাম দিকে নেভিগেশন যুক্ত করতে পৃষ্ঠাটি একটি কাস্টম পৃষ্ঠার টেম্পলেট ব্যবহার করবে। তবে সব ক্লুঙ্কি মনে হচ্ছে।

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

আমার আদর্শ সমাধানের সাথে সমস্যাটি সেটিংস is ওয়ার্ডপ্রেস আপনাকে সাইটের ডিফল্ট হোম পৃষ্ঠার জন্য একটি পৃষ্ঠা নির্বাচন করতে দেয়। তবে এটি কোনও পোস্টের পৃষ্ঠার সাথে জড়িত এবং আমি নিশ্চিত নই যে এটি পরিবর্তন করতে কোথা থেকে প্রবেশ করতে হবে যাতে ব্যবহারকারীরা একটি স্ট্যাককে ডিফল্ট হোম পৃষ্ঠা হিসাবে বেছে নিতে পারে ।

সুতরাং, ডিফল্ট হোম পৃষ্ঠার জন্য উপলব্ধ পৃষ্ঠাগুলির ড্রপডাউনটিতে সিপিটি যুক্ত করার জন্য আমি কোথায় প্রবেশ করব?

উত্তর:


11

দরকারী উত্তরের জন্য @ টোসচোকে ধন্যবাদ, তবে এটি আমার কাছে কিছুটা হ্যাচিশ অনুভূত হয়েছিল, তাই আমি কিছুটা হাঁকিয়েছি এবং বুঝলাম এর পরিবর্তে আমি একটি ফিল্টার যুক্ত করতে পারলাম:

function wpa18013_add_pages_to_dropdown( $pages, $r ){
    if('page_on_front' == $r['name']){
        $args = array(
            'post_type' => 'stack'
        );
        $stacks = get_posts($args);
        $pages = array_merge($pages, $stacks);
    }

    return $pages;
}
add_filter( 'get_pages', 'wpa18013_add_pages_to_dropdown', 10, 2 );

হালনাগাদ

উপরের কোডটি যুক্ত করার পরে আমি প্রকৃতপক্ষে হোম পেজ হিসাবে একটি কাস্টম পোস্ট টাইপ ব্যবহার করতে সক্ষম হয়েছি, তবে ওয়ার্ডপ্রেস পার্মালিঙ্কগুলি পুনর্নির্দেশ করবে কারণ এটি কোনও "পৃষ্ঠা" পোস্টের ধরণ ছিল না। তাই http://localhost/testপুনর্নির্দেশ হবে http://localhost/test/stacks/home-stack, যা আমি চেয়েছিলাম না।

এই ক্রিয়াটি যুক্ত করা, এটি ঠিক করা হয়েছে এবং হোম পৃষ্ঠার পৃষ্ঠাগুলির সাথে আমার কাস্টম পোস্ট প্রকারটি অনুসন্ধান করে:

function enable_front_page_stacks( $query ){
    if('' == $query->query_vars['post_type'] && 0 != $query->query_vars['page_id'])
        $query->query_vars['post_type'] = array( 'page', 'stack' );
}
add_action( 'pre_get_posts', 'enable_front_page_stacks' );

আমি এই জাতীয় ফিল্টারটিও খেললাম, তবে এটি প্রথম পৃষ্ঠার ক্যোয়ারিতে সীমাবদ্ধ থাকতে হবে। এবং তারপরে আমি কিছু অদ্ভুত আচরণ / বাগ দ্বারা পিটিয়েছি: আমি মাত্র 404 পেয়েছি s যাইহোক +1। :)
ফুসিয়া

ভালো বল ধরা. ফাংশনের অভ্যন্তরে অতিরিক্ত শর্তযুক্ত (নিশ্চিত করুন যে post_typeইতিমধ্যে সেট করা নেই এবং এটি page_id0 নয়) সমস্ত 404 কে বাধা দেয় preven আমি এখন আমার সমস্ত কাস্টম পোস্ট, আমার সমস্ত পোস্ট এবং আমার সমস্ত পৃষ্ঠার জন্য কোনও হস্তক্ষেপ ছাড়াই অনুসন্ধান চালাতে পারি।
EAMAN

@ ইমান এই কোডটির জন্য ধন্যবাদ! এটি যেমনটি করা উচিত তেমন কাজ করে, যদিও এটি প্রথম পৃষ্ঠার শিরোনামটিকে পোস্টের শিরোনামে পরিবর্তন করে হোমপেজের নাম, এটি কি কোনওভাবে হ'ল হোমপেজের নাম হতে পারে?
INT

এটি মোটেও কাজ করে না ... সার্ভার সতর্কতা / ত্রুটি: wpa18013_add_pages_to_roddown () এবং অপরিজ্ঞাত ভেরিয়েবলের
দামির

8

হয়তো তাই? আমার আগের সমাধানটির সংশোধিত সংস্করণ ।

add_filter( 'wp_dropdown_pages', 'add_cpt_to_front_page_dropdown', 10, 1 );


/**
 * Adds CPTs to the list of available pages for a static front page.
 *
 * @param  string $select Existing select list.
 * @return string
 */
function add_cpt_to_front_page_dropdown( $select )
{
    if ( FALSE === strpos( $select, '<select name="page_on_front"' ) )
    {
        return $select;
    }

    $cpt_posts = get_posts(
        array(
            'post_type'      => 'YOUR_POST_TYPE'
        ,   'nopaging'       => TRUE
        ,   'numberposts'    => -1
        ,   'order'          => 'ASC'
        ,   'orderby'        => 'title'
        ,   'posts_per_page' => -1
        )
    );

    if ( ! $cpt_posts ) // no posts found.
    {
        return $select;
    }

    $current = get_option( 'page_on_front', 0 );

    $options = walk_page_dropdown_tree(
        $cpt_posts
    ,   0
    ,    array(
            'depth'                 => 0
         ,  'child_of'              => 0
         ,  'selected'              => $current
         ,  'echo'                  => 0
         ,  'name'                  => 'page_on_front'
         ,  'id'                    => ''
         ,  'show_option_none'      => ''
         ,  'show_option_no_change' => ''
         ,  'option_none_value'     => ''
        )
    );

    return str_replace( '</select>', $options . '</select>', $select );
}

এটি কেবলমাত্র কাস্টম পোস্টের প্রকারটি নির্বাচন করতেই হবে, তবে এটি কি সেই কাস্টম পোস্ট প্রকারটিকে প্রথম পৃষ্ঠা হিসাবে প্রদর্শন করে না? নাকি আমি কিছু মিস করছি?
হামেদুল্লাহ খান

@ হামেদুল্লাহ - একবার আপনি এটি নির্বাচন করলে, ওয়ার্ডপ্রেস একটি বিকল্প আপডেট করে যা প্রথম পৃষ্ঠার জন্য কোন পৃষ্ঠাটি ব্যবহার করা হবে তা চিহ্নিত করে। তারপরে, যখন কোনও ব্যবহারকারী প্রথম পৃষ্ঠাতে যান, ওয়ার্ডপ্রেস একই বিকল্পটি ডাটাবেস থেকে ফিরে পড়ে।
EAMAN

@ হামেদুল্লাহ খান আপনি ঠিক বলেছেন এটি ৩.১ এর আগে কাজ করেছিল, এখন আমি পোস্টের পার্মালিঙ্কে পুনঃনির্দেশিত করেছি - এবং আমি একটি ৪০৪ পেয়েছি St অদ্ভুত। আমি আশা করি আমি এই জন্য সময় ছিল। :(
ফুসিয়া

5

কেন কেবল কোনও front-page.phpটেম্পলেট ফাইল তৈরি করবেন না , যা হয় সাধারণ কোয়েরি / লুপ ব্যবহার করে বা (যদি কোনও কাস্টম থিম বিকল্পটি সম্মুখ পৃষ্ঠায় সিপিটি প্রদর্শন করতে সেট করা থাকে), সিপিটির উপর ভিত্তি করে একটি কাস্টম ক্যোয়ারী / লুপ আউটপুট দেয়?

সেখানে সমস্যাটি হ'ল আপনাকে ফ্রন্ট পৃষ্ঠা আউটপুট নিয়ন্ত্রণ করতে একটি পৃথক থিম বিকল্প তৈরি করতে হবে, একই সাথে ব্যবহারকারীদের ফ্রন্ট পৃষ্ঠাটি স্থিতিশীল পৃষ্ঠায় সেট করার নির্দেশ দেওয়ার সময়।

জিনিসগুলিকে আরও সহজ করার জন্য, আপনি register_settingসেটিংস এপিআইয়ের মাধ্যমে আপনার কলটিতে "রিডিং" বিকল্প গ্রুপটি ব্যবহার করে আপনার থিম বিকল্পটি সেটিংস-পঠন করতে সক্ষম করতে পারেন , যাতে এটি বিদ্যমান ফ্রন্ট-পৃষ্ঠা বিকল্পগুলির সাথে প্রদর্শিত হয় lays


আমি সাধারণ সমাধানগুলি পছন্দ করি এবং চিপ আমি মনে করি যে এটির চেয়ে ভাল। ওয়ার্ডপ্রেস প্রথম পৃষ্ঠার কোডেক্স.ওয়ার্ডপ্রেস.আর. / টিমপ্লেটহিয়ারারচি# হোম_পেজ_ডিসপ্লে এর জন্য কাস্টম টেম্পলেটগুলির অনুমতি দেয় এবং তারপরে যে কোনও একটি যা পছন্দ করে তা করতে পারে।
আনমারি

এটি সর্বাধিক রক্ষণাবেক্ষণযোগ্য এবং সোজা সমাধান। front-page.phpস্বয়ংক্রিয়ভাবে নির্বাচিত হয়, কারণ ওয়ার্ডপ্রেস টেমপ্লেট অনুক্রমের অংশ। কেন এটি হচ্ছে তা মনে করার দরকার নেই (বা এটি পরবর্তী ব্যক্তির জন্য চিহ্নিত করার দরকার আছে)।
ওডিস

2

আমি মনে করি যে ২০১১ সালে ইএ্যামান তার আপডেট লেখার পরে কিছু পরিবর্তিত হতে পারে এবং তিনি সরবরাহ করা wpa18013_add_pages_to_roddown () ফাংশনটি আর কাজ করে না। দমিরের মন্তব্যে যেমন উল্লেখ করা হয়েছে, এই ফাংশনটি বর্তমানে (ডিসেম্বর 2013) একটি ত্রুটি ছুড়ে দিয়েছে "wpa18013_add_pages_to_roddown () এর জন্য 2 টি অনুপস্থিত যুক্তি"

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

function add_unbox_tabs_to_dropdown( $pages ){
    $args = array(
        'post_type' => 'unbox_tabs'
    );
    $items = get_posts($args);
    $pages = array_merge($pages, $items);

    return $pages;
}
add_filter( 'get_pages', 'add_unbox_tabs_to_dropdown' );

function enable_front_page_unbox_tabs( $query ){
    if('' == $query->query_vars['post_type'] && 0 != $query->query_vars['page_id'])
        $query->query_vars['post_type'] = array( 'page', 'unbox_tabs' );
}
add_action( 'pre_get_posts', 'enable_front_page_unbox_tabs' );

দয়া করে নোট করুন যে উপরের উদাহরণে আমি যে কাস্টম পোস্ট টাইপ করছি তা হ'ল "স্ট্যাক" না দিয়ে "আনবক্স_ট্যাবস"।


1

আমি একটি প্লাগইন থেকে একটি টেমপ্লেট অন্তর্ভুক্ত করতে এই কৌশলটি ব্যবহার করছি । সুতরাং, @ চিপবনেটের সমাধানটি প্রয়োগ হয় না।

স্ট্যাটিক পৃষ্ঠাগুলির তালিকায় প্লাগইন থেকে সিপিটির ( ) যোগ করতে আমি @ ইএএমএএন এর সমাধানটি নিম্নরূপে সংশোধন করেছি: 'hierarchical' => 'false'

add_action( 'admin_head-options-reading.php', 'wpse_18013_modify_front_pages_dropdown' );
add_action( 'pre_get_posts', 'wpse_18013_enable_front_page_stacks' );

function wpse_18013_modify_front_pages_dropdown()
{
    // Filtering /wp-includes/post-templates.php#L780
    add_filter( 'get_pages', 'wpse_18013_add_cpt_to_pages_on_front' );
}

function wpse_18013_add_cpt_to_pages_on_front( $r )
{
    $args = array(
        'post_type' => 'stack'
    );
    $stacks = get_posts( $args );
    $r = array_merge( $r, $stacks );

    return $r;
}

function wpse_18013_enable_front_page_stacks( $query )
{
    if( '' == $query->query_vars['post_type'] && 0 != $query->query_vars['page_id'] )
        $query->query_vars['post_type'] = array( 'page', 'stack' );
}

মূল রেফারেন্স v3.4.2:
3.5 আরসি 3 তে লাইন সংখ্যার সামান্য পার্থক্য, তবে কোডটি একই রয়েছে

/**
 * wp-admin/options-reading.php#L96
 * Happens inside a <li><label>-</label></li>
 */
    wp_dropdown_pages( array( 
                'name' => 'page_on_front'
            ,   'echo' => 0
            ,   'show_option_none' => __( '&mdash; Select &mdash;' )
            ,   'option_none_value' => '0'
            ,   'selected' => get_option( 'page_on_front' ) 
        ) 
    )

/**
  * wp-includes/post-template.php#L768
  */
function wp_dropdown_pages($args = '') {
    $defaults = array( /* defaults array */ );    
    $r = wp_parse_args( $args, $defaults );
    extract( $r, EXTR_SKIP );  
    $pages = get_pages( $r );
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.