কীভাবে চাইল্ড থিম থেকে পিতামাতার থিম পৃষ্ঠা টেমপ্লেট * অপসারণ করবেন?


17

চাইল্ড থিম তৈরি করতে আমি টোয়েন্টি টেন থিমটি ব্যবহার করছি, তবে টুয়েন্টি টেন প্যারেন্ট থিমটিতে থাকা 'এক কলাম, কোনও সাইডবার নয়' পৃষ্ঠা টেমপ্লেট থেকে আমি মুক্তি পাব বলে মনে হচ্ছে না।

আমি ভেবেছিলাম এটি কেবল অনুলিপি করা এবং বিষয়বস্তু মুছে ফেলা কৌশলটি করবে তবে এটি মনে হয় না। কেউ কি জানেন, এটা কিভাবে করে? আমি নিশ্চিত এটি খুব সহজ।

ধন্যবাদ

Osu

উত্তর:


11

এই টেমপ্লেটটি মুছে ফেলার চেয়ে ওভাররাইড করা আরও সহজ হবে। যুক্তি যেভাবে যায়।

আমি দাবী করি না যে এটি দক্ষ ধারণা (দেরিতে এখানে), তবে এটি সম্পাদনা স্ক্রিন থেকে এটিকে নিকৃষ্ট করে তুলবে:

add_action('admin_head-post.php','remove_template');

function remove_template() {

    global $wp_themes;

    get_themes();
    $templates = &$wp_themes['Twenty Ten']['Template Files'];
    $template = trailingslashit( TEMPLATEPATH ).'onecolumn-page.php';
    $key = array_search($template, $templates);
    unset( $templates[$key] );
}

এর জন্য ধন্যবাদ, এটি একটি ভাল সমাধানের মতো দেখায় - আপনি যখন টেম্পলেটটিকে ওভাররাইড করে বলছেন, আপনি কি সেখানে কোনওভাবেই একটি কলামের টেম্পলেট অন্তর্ভুক্ত করতে চান? বা আপনি কি এটির অর্থ কোনও টেমপ্লেটটি দিয়ে ওভাররাইডিং করতে চাইছেন যা আমি আসলে ব্যবহার করতে চাই (অর্থাত এটি ওয়ান কলাম বলে তবে এটিতে 2 বা 3 কলাম রয়েছে?)?
ওসু

@ ওসু বলতে চাইছি আপনার নিজের অনুরূপ টেম্পলেটটি দিয়ে ওভাররাইড করা। যুক্তি যতদূর যায় চাইল্ড থিমের পক্ষে পিতা-মাতার থিমের টেমপ্লেটগুলি পরিবর্তন করা এবং যুক্ত করা সহজ তবে এগুলি অক্ষম করা শক্ত। মূলত চাইল্ড থিমটি পিতামাতাদের থিমের চেয়ে বেশি করার কথা রয়েছে, কম নয়। এবং কোড যুক্তি এই নীতি অনুসরণ করে।
প্রথম

আহ, ঠিক আছে. যে পরিষ্কার করার জন্য ধন্যবাদ। আমি তখন তাদের জন্য একটি কোল টেম্পলেট তৈরি করব। চিয়ার্স
ওসু

যে কেউ jQuery ব্যবহার করে ড্রপডাউন তালিকা থেকে থিমটি সরাতে চায়, তার জন্য এটি অন্য একটি পদ্ধতি (যদিও এটি সবচেয়ে ভাল উপায় কিনা তা নিশ্চিত নয়): pastie.org/3710683
ওসু

2
@ ব্রাজোফিলো থিম-সম্পর্কিত ইন্টার্নালগুলি বড় রিফ্যাক্টরিং এবং এপিআই পরিবর্তনগুলি 3.4 এ গেছে, সুতরাং প্রচুর পুরানো জিনিস কাজ করবে না
রাস্ট

29

ওয়ার্ডপ্রেস 3.9 একটি theme_page_templatesফিল্টার প্রবর্তন করে ।

বিশটি চৌদ্দ শিশু থিমের নীচের উদাহরণটি functions.phpদেখায় যে কীভাবে "অবদানকারী পৃষ্ঠা" টেম্পলেটটি সরিয়ে ফেলা হবে:

function tfc_remove_page_templates( $templates ) {
    unset( $templates['page-templates/contributors.php'] );
    return $templates;
}
add_filter( 'theme_page_templates', 'tfc_remove_page_templates' );

3
এটি ডব্লিউপি 3.9+ এর জন্য আপডেট হওয়া স্বীকৃত উত্তর হওয়া উচিত
হেলগাটিভিকিং

9

@ রার্স্টের জবাবটি প্রসারিত করার জন্য, এখানে আরও জেনেরিক দৃষ্টিভঙ্গি দেওয়া হয়েছে যা নির্দিষ্ট থিমের সাথে আবদ্ধ নয়, তবে আপনার নিজস্ব থিমের ফাংশনগুলির মধ্যে ব্যবহার করা যেতে পারে you

function remove_template( $files_to_delete = array() ){
    global $wp_themes;

    // As convenience, allow a single value to be used as a scalar without wrapping it in a useless array()
    if ( is_scalar( $files_to_delete ) ) $files_to_delete = array( $files_to_delete );

    // remove TLA if it was provided
    $files_to_delete = preg_replace( "/\.[^.]+$/", '', $files_to_delete );

    // Populate the global $wp_themes array
    get_themes();

    $current_theme_name = get_current_theme();

    // Note that we're taking a reference to $wp_themes so we can modify it in-place
    $template_files = &$wp_themes[$current_theme_name]['Template Files'];

    foreach ( $template_files as $file_path ){
        foreach( $files_to_delete as $file_name ){
            if ( preg_match( '/\/'.$file_name.'\.[^.]+$/', $file_path ) ){
                $key = array_search( $file_path, $template_files );
                if ( $key ) unset ( $template_files[$key] );
            }
        }
    }
}

সুতরাং আপনি এটি আপনার চাইল্ড থিমের ফাংশন.এফপি ফাইলটিতে এটি ব্যবহার করতে পারেন:

add_action( 'admin_head-post.php', 'remove_parent_templates' );

function remove_parent_templates() {
    remove_template( array( "showcase.php", "sidebar-page" ) );
}

এখানে আমি কেবল চিত্রিত করছি যে আপনি না চাইলে আপনাকে ".pp" অংশটি পাস করতে হবে না।

বা: remove_template( "sidebar-page" );- আপনি যদি কেবল একটি একক ফাইল পরিবর্তন করতে চান তবে আপনাকে কোনও অ্যারে পাস করার দরকার নেই।


6

পৃষ্ঠার টেমপ্লেটগুলি সরাতে ডব্লুপি কোর (3.9) এ একটি নতুন ফিল্টার রয়েছে। এটি শিশু থিম থেকে ব্যবহার করা যেতে পারে।

টুয়েন্টি টেনে এটি কীভাবে অর্জন করা যায় তা এখানে (WP 3.9 তে পরীক্ষা করা):

add_filter( 'theme_page_templates', 'my_remove_page_template' );
    function my_remove_page_template( $pages_templates ) {
    unset( $pages_templates['onecolumn-page.php'] );
    return $pages_templates;
}

https://core.trac.wordpress.org/changeset/27297

http://boiteaweb.fr/theme_page_templates-hook-semaine-16-8033.html


লিঙ্কটি পরিবর্তিত হয় বা নামিয়ে নেওয়া হলে একটি লিঙ্ক অফসাইট অকেজো হয়ে যায়। এটি আসলে প্রশ্নের উত্তর দেওয়ার চেষ্টাও করে না
টম জে নওয়েল

যথেষ্ট ভাল, উদাহরণ যোগ করা।
মারসিও ডুয়ার্টে

1

যেহেতু পূর্ববর্তী উত্তরগুলি এখানে ওয়ার্ডপ্রেসের বর্তমান সংস্করণগুলিতে আর কাজ করে না এবং একটি সম্পর্কিত প্রশ্ন ছিল যা আমি ঠিক উত্তর দিয়েছি (এপ্রিল ২০১৩) পিএইচপি আউটপুট বাফার ব্যবহার করে আমি অনুভব করেছি যে আমি সেই উত্তরের একটি লিঙ্ক পোস্ট করব ।

এছাড়াও সবেমাত্র ওমিট প্যারেন্ট থিম পৃষ্ঠা টেম্পলেট প্লাগইন প্রকাশ করেছে যা ওয়ার্ডপ্রেস "পৃষ্ঠা" যুক্ত করার সময় সম্পাদনা করার সময় পৃষ্ঠা বৈশিষ্ট্য মেটাবক্সে টেমপ্লেটগুলির ড্রপডাউন তালিকা থেকে সমস্ত প্যারেন্ট থিম পৃষ্ঠা টেম্পলেটগুলি ফিল্টার করে


0

জুলাই 10, 2012 - ওয়ার্ডপ্রেস 3.4.1

পূর্ববর্তী উত্তরগুলি কাজ করছে না এবং যেমন রাস্ট একটি মন্তব্যে বলেছেন:

থিম-সম্পর্কিত ইন্টার্নালগুলি বড় রিফ্যাক্টরিং এবং এপিআই পরিবর্তনগুলি 3.4 এ গেছে, সুতরাং প্রচুর পুরানো স্টাফ কাজ করবে না

দ্রুত এবং নোংরা jQuery সমাধান

add_action('admin_head', 'wpse_13671_script_enqueuer');

function wpse_13671_script_enqueuer() {
    global $current_screen;

    /**
     * /wp-admin/edit.php?post_type=page
     */
    if('edit-page' == $current_screen->id) 
    {
        ?>
        <script type="text/javascript">         
        jQuery(document).ready( function($) {
            $("a.editinline").live("click", function () {
                var ilc_qe_id = inlineEditPost.getId(this);
                setTimeout(function() {
                        $('#edit-'+ilc_qe_id+' select[name="page_template"] option[value="showcase.php"]').remove();  
                    }, 100);
            });

            $('#doaction, #doaction2').live("click", function () {
                setTimeout(function() {
                        $('#bulk-edit select[name="page_template"] option[value="showcase.php"]').remove();  
                    }, 100);
            });       
        });    
        </script>
    <?php
    }

    /**
     * /wp-admin/post.php?post=21&action=edit
     */
    if( 'page' == $current_screen->id ) 
    {
        ?>
        <script type="text/javascript">
        jQuery(document).ready( function($) {
            $('#page_template option[value="showcase.php"]').remove();
        });
        </script>
    <?php
    }
}

এর জন্য কোনও হুক নেই?

আমি যদি সঠিক পথ অনুসরণ করি তবে এখানেই "ক্রিয়া" ঘটে ( /wp-includes/class-wp-theme.php), এবং দেখে মনে হচ্ছে এখানে দেখার মতো কিছুই নেই ...

/**
 * Returns the theme's page templates.
 *
 * @since 3.4.0
 * @access public
 *
 * @return array Array of page templates, keyed by filename, with the value of the translated header name.
 */
public function get_page_templates() {
    // If you screw up your current theme and we invalidate your parent, most things still work. Let it slide.
    if ( $this->errors() && $this->errors()->get_error_codes() !== array( 'theme_parent_invalid' ) )
        return array();

    $page_templates = $this->cache_get( 'page_templates' );

    if ( ! is_array( $page_templates ) ) {
        $page_templates = array();

        $files = (array) $this->get_files( 'php', 1 );

        foreach ( $files as $file => $full_path ) {
            $headers = get_file_data( $full_path, array( 'Template Name' => 'Template Name' ) );
            if ( empty( $headers['Template Name'] ) )
                continue;
            $page_templates[ $file ] = $headers['Template Name'];
        }

        $this->cache_add( 'page_templates', $page_templates );
    }

    if ( $this->load_textdomain() ) {
        foreach ( $page_templates as &$page_template ) {
            $page_template = $this->translate_header( 'Template Name', $page_template );
        }
    }

    if ( $this->parent() )
        $page_templates += $this->parent()->get_page_templates();

    return $page_templates;
}

ট্র্যাকের টিকিট: core.trac.wordpress.org/ticket/21891
mrwweb
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.