ฉันจะเพิ่มตัวเลือกในรายการเทมเพลทของหน้าจากปลั๊กอินได้อย่างไร


10

ฉันดูรอบสองสามชั่วโมงที่ผ่านมาเพื่อสร้างแม่แบบหน้ากำหนดเองจากภายในปลั๊กอิน แต่ยังไม่มีโชคใด ๆ

สิ่งที่ฉันพยายามทำโดยเฉพาะคือเพิ่มตัวเลือกในรายการของเทมเพลตหน้าที่มีอยู่เมื่อแก้ไขหน้าและไม่ใช้วิธีอื่นเช่นif( is_page( 'page-slug' ) ) { /* etc */ }

มีตัวแปรทั่วโลกที่ฉันสามารถแก้ไขการทำเช่นนี้?

แก้ไข:

ฉันใช้รหัสนี้ในขณะนี้ตามลิงค์ @ m0r7if3r แสดงความคิดเห็นให้ฉันปัญหาคือมันจะเรียกใช้ฟังก์ชั่นนี้เมื่อดูหน้า แต่ไม่ใช่เมื่อแก้ไขหน้า (เพื่อเติมรายการแบบเลื่อนลงด้วยเทมเพลตหน้า) :

class JW_SiteGrader {

    private static $instance;

    private function __construct() {


        add_action( 'template_redirect', array( &$this, 'sitegrader_template_redirect' ), 20 );

    }

    public static function getInstance() {

        // Return the class data in a Singleton fashion
        if (self::$instance == null)
            self::$instance = new JW_SiteGrader();
        return self::$instance;

    }

    public function sitegrader_template_redirect() {

        add_filter( 'page_template', array( &$this, 'sitegrader_page_template' ), 10, 1 );

    }

    public function locate_plugin_template( $template_names, $load = false, $require_once = true ) {

        if ( !is_array( $template_names ) )
            return '';

        $located = '';

        $this_plugin_dir = WP_PLUGIN_DIR . '/' . str_replace( basename( __FILE__ ), '', plugin_basename( __FILE__ ) );

        foreach ( $template_names as $template_name ) {

            if ( !$template_name )
                continue;

            if ( file_exists( STYLESHEETPATH . '/' . $template_name ) ) {

                $located = STYLESHEETPATH . '/' . $template_name;
                break;

            } else if ( file_exists( TEMPLATEPATH . '/' . $template_name ) ) {

                $located = TEMPLATEPATH . '/' . $template_name;
                break;

            } else if ( file_exists( $this_plugin_dir .  $template_name ) ) {

                $located =  $this_plugin_dir . $template_name;
                break;

            }

        }

        if ( $load && '' != $located )
            load_template( $located, $require_once );

        return $located;
    }

    public function sitegrader_page_template( $template ) {

        $object = get_queried_object();

        if ( 'page' == $object->post_type ) {

            // New 
            $templates[] = "page-sitegrader.php";
            // Like in core
            $templates[] = "page-{$object->post_type}.php";
            $templates[] = "page.php";

            return locate_template( $templates );  

        }

        // return apply_filters('page_template', $template);
        return $template;
    }

}

แก้ไข 2:

ดูเหมือนว่าฟังก์ชั่นนี้จะเปิดตัวในการอัพเดทในอนาคตฉันได้อ่านตั๋ว trac จำนวนเล็กน้อยเกี่ยวกับเรื่องนี้และมีการพูดคุยกันบ้าง แต่ไม่มีคำตอบที่แท้จริง (หวังว่าจะเป็น 3.4) จะแสดงรายการ URL ตั๋ว trac ที่นี่เล็กน้อย

แก้ไข 3:

โค้ดด้านบนใช้งานได้ แต่ปัญหาเดียวที่ฉันมีอยู่ในตอนนี้คือไม่มีเทมเพลตที่ถูกเพิ่มลงในรายการดรอปดาวน์เมื่อแก้ไข / เพิ่มหน้าใหม่ ฉันพยายามทำบางสิ่งและจะอัปเดตคำถามของฉันในไม่ช้า


2
คุณได้ลองอะไรเช่นนี้ ?
mor7ifer

@ m0r7if3r (หากคุณลองโปรดฝากข้อความถึงวิธีการทำงาน - ขอบคุณ!)
kaiser

@kaiser ฉันลองใช้รหัสที่เขาแนะนำลิงก์ที่หายไปเพียงอย่างเดียวคือการรับเมตาบ็อกซ์เพื่อเพิ่มเทมเพลตในรายการแบบเลื่อนลง (เท่าที่ฉันรู้!)
Jared

@ Jared ดูคำตอบนี้โดยฉันเพื่อ Q ที่คล้ายกันและตั๋ว trac ที่เกี่ยวข้องที่ด้านล่างของ a โฆษณาโค้ดของคุณ) หากโค้ดไม่แสดงผลในทุกหน้าแสดงว่าคุณใช้ hooks ที่ไม่ถูกต้องเพื่อใช้งานอินสแตนซ์ คุณใช้ตะขออันไหน
ไกเซอร์

@kaiser ฉันกำลังใช้page_templateเบ็ดรหัสด้านบนในการแก้ไขของฉันคือสิ่งที่กำลังใช้อยู่ ฉันจำเป็นต้องใช้template_redirectตะขอแล้วเพิ่มpage_templateตัวกรองในนั้นหรือไม่
Jared

คำตอบ:


4

ฟิลเตอร์? ใคร?

มีไม่มีตัวกรองที่นั่นเพื่อช่วยเหลือ: page_template_dropdown($template);ใช้ในการสร้างแบบเลื่อนลงและก็ไม่ได้กรอง

เข้าสู่อาร์เรย์เทมเพลตหรือไม่

ในการสร้างเนื้อหาแบบเลื่อนดาวน์แกนกล่อง meta get_page_templates()ใช้ จากภายในฟังก์ชั่นมีลักษณะดังนี้:

$themes = get_themes();
$theme = get_current_theme();
$templates = $themes[$theme]['Template Files'];

แต่เมื่อดูget_themes();แล้วจะไม่มีโอกาสที่จะสกัดกั้นรายการของแม่แบบ ยิ่งกว่านั้นเรามีปัญหาว่าไม่มีโอกาสที่จะได้รับแม่แบบจากนอกไดเรกทอรีธีม ...

... แกล้งทำชุดรูปแบบ!

ทฤษฎีและข้อเสียของมัน ...

คุณสามารถใช้register_theme_directory()เพื่อเพิ่มไดเรกทอรีธีมเพิ่มเติมที่คุณสามารถวางแม่แบบ ดังนั้นสิ่งที่ง่ายที่สุดคือการลงทะเบียนปลั๊กอินของคุณเป็นโฟลเดอร์ชุดรูปแบบด้วย:

// Register during init hook:
register_theme_directory( plugin_dir_path( __FILE__ ).'templates' );

หมายเหตุ: นี่เป็นที่ที่ผมไม่แน่ใจว่ามันจะทำงาน

ระหว่างการเปิดใช้งานปลั๊กอิน: จากนั้นคุณควรวางstyle.css.phpไฟล์ไว้ในtemplatesโฟลเดอร์ของคุณ สิ่งนี้จะช่วยให้คุณเพิ่มตัวแปรในไฟล์ของคุณ ตัวแปรนี้จะเป็นธีมหลัก และชุดรูปแบบหลักควรเป็นชุดรูปแบบที่ใช้งานอยู่ในปัจจุบัน จากนั้นอัปเดตชุดรูปแบบที่ใช้งานอยู่เป็นปลั๊กอินของคุณ

ข้อเสียเปรียบ # 2: เกี่ยวกับ»ลักษณะที่ปรากฏ« UI ...อาจเพิ่มหมายเหตุว่า "ชุดรูปแบบ" นี้ไม่ได้มีไว้สำหรับใช้เป็นธีมจริง ฉันปล่อยให้ส่วนที่เหลือของ»หลีกเลี่ยงการเปิดใช้งานชุดรูปแบบ«สิ่งที่ขึ้นอยู่กับจินตนาการของคุณ อย่างไรก็ตามมันควรใช้งานได้ดี

ข้อเสียเปรียบ # 2: เคล็ดลับนี้จะหลีกเลี่ยงธีมลูกได้สำเร็จ คุณได้รับอนุญาตให้มีธีมหลักหนึ่งรายการ ไม่มีอะไรเพิ่มเติม


ดังนั้นฉันจึงคาดเดาว่าไม่มีวิธีที่จริงในการใช้เทมเพลตหน้าแบบกำหนดเองจากธีมที่ไม่ใช้งานใช่ไหม? ฉันสามารถลงทะเบียนไดเรกทอรีธีม แต่เทมเพลต แต่ไม่สามารถใช้งานได้เว้นแต่ว่าธีมนั้นเปิดใช้งานอยู่
Jared

1
ไม่ได้จริงๆ มันก็ไม่ควรที่จะเป็นและดังนั้นจึงขาดแกน คุณลองลิงค์ไปยังipstenuด้านบนหรือไม่ ฉันลองเส้นทางนั้นแล้ว แต่จบลงด้วยวิธีที่ตายแล้ว - ด้วยวิธีแก้ไขปัญหาอื่น ทางออกที่ดีที่สุดคือการตามตั๋วผลักดันและเชื่อมโยงพวกเขาทุกที่ที่คุณอยู่ : /
kaiser

2

คุณได้พิจารณาใช้ระบบไฟล์ WordPress เพื่อเขียนไฟล์เทมเพลตหน้าจากปลั๊กอินของคุณไปยังไดเรกทอรีธีมที่ใช้งานอยู่ในปัจจุบัน ขึ้นอยู่กับว่าคุณต้องการการควบคุมมากน้อยเพียงใดในขั้นตอนนี้คุณสามารถให้ปลั๊กอินของคุณเขียนไฟล์เมื่อเปิดใช้งานและลบออกเมื่อถอนการติดตั้ง หรือคุณสามารถสร้างไฟล์เทมเพลตหน้าแบบไดนามิกจากภายใน UI ปลั๊กอินของคุณโดยใช้แบบฟอร์มเพื่อส่งค่าบางอย่างเช่นชื่อเทมเพลตหน้าซึ่งจะปรากฏในกล่องดร็อปดาวน์ของหน้าจอแก้ไขโพสต์ ในทางทฤษฎีคุณสามารถลบเทมเพลตหน้าออกจากภายใน UI ปลั๊กอินของคุณได้ด้วยการคลิกปุ่มเพียงปุ่มเดียว มีโพสต์ที่ดีเกี่ยวกับการใช้ระบบไฟล์บนบล็อกของ Otto ฉันไม่มีลิงค์กับฉันตอนนี้ แต่คุณสามารถค้นหาได้

ฉันหวังว่าพวกเขาจะปล่อยสิ่งที่คุณตั้งใจจะทำโดยใช้เบ็ดในการเปิดตัวแกนหลักต่อไป


1
ฉันมีวิธีการเช่นนี้ก่อนหน้านี้ แต่มีปัญหามากมายเมื่อฉันลองใช้เพราะเมื่อผู้ใช้เปลี่ยนธีมมันจะไม่ลบไฟล์เทมเพลตและหากพวกเขาคัดลอกธีมที่ใช้งานอยู่และวางไว้ในเว็บไซต์อื่น พวกเขาอาจเสี่ยงต่อการอัปโหลดไฟล์แม่แบบที่กำหนดเองซึ่งไม่สามารถใช้งานได้ ฉันรู้ว่ามีหลายวิธีการแก้ปัญหาสำหรับว่า แต่ผมอยากให้เรื่องนี้เป็นไปโดยอัตโนมัติ +1 สำหรับคำแนะนำว่า
Jared

1
สวัสดีจาเร็ดฉันก็เป็นห่วงเรื่องเดียวกัน ทางออกเดียวที่ฉันคิดว่าจะขยายวิธีการทางเลือกนี้ต่อไปคือให้ปลั๊กอินใช้งานเมื่อได้รับชื่อธีมปัจจุบันจากนั้นหากผู้ใช้ปิดการใช้งาน / เปลี่ยนธีมคุณสามารถลบไฟล์เทมเพลตจากชุดรูปแบบนั้น กระทู้ ลองดูที่ลิงค์นี้ซึ่งเขาสร้าง hooks การเปิดใช้งาน / การเลิกใช้งานของเขาเองสำหรับการตรวจสอบธีม ด้วยรหัสพิเศษเล็กน้อยฉันรู้สึกว่ามันทำได้
อดัม

แน่นอนฉันคิดว่ามันอาจใช้ได้ ฉันจะให้มันไปและโพสต์ผลลัพธ์ในคำถามของฉัน ขอบคุณสำหรับลิงค์มันช่วยได้!
Jared

1

ฉันดูผ่านแหล่งข้อมูลและค่อนข้างน่าแปลกใจที่ไม่มีวิธีการทำเช่นนี้! แฮ็คที่แนะนำของฉันคือการเพิ่มเมตาบ็อกที่สองพร้อมกับการแทนที่ธีม / ดรอปดาวน์ธีมที่สอง จากนั้นขอลงในตัวกรองนี้:

# wp-includes/theme.php line 751 in 3.3.1:
return apply_filters( "{$type}_template", locate_template( $templates ) );

เพื่อส่งคืนไฟล์ธีมของคุณหากไฟล์นั้นถูกเขียนทับ แน่นอนคุณจะต้องเพิ่มแค่ตัวกรองถ้ามันเป็นโพสต์ที่คุณต้องการ

หากคุณต้องการแฟนซีคุณสามารถคัดลอกกล่องเดิมและสร้างใหม่ได้ (ผ่านตัวกรองแน่นอนไม่แก้ไขรหัสแกนหลัก)

ฉันขอแนะนำให้เพิ่มตั๋ว tracเพื่อขอฟังก์ชันการทำงานนั้น (หากไม่มีอยู่ในนั้น)


1
เห็นด้วย w / แนะนำสิ่งนี้สำหรับ trac
helgatheviking

ดูเหมือนว่าจะอยู่ใน trac: core.trac.wordpress.org/ticket/15803
Jared

1
ฉันเพียงแค่การตรวจสอบนี้Q เกี่ยวกับประเภทโพสต์เดียวแม่อีก คุณสามารถค้นหาตั๋ว Trac ได้ในตอนท้ายของคำตอบ Let 's หวังสำหรับ 3.4
ไกเซอร์

1

ฉันเคยทำสิ่งนี้มาแล้วในอดีตโดยลบเทมเพลตหน้าเริ่มต้นออกจากนั้นเพิ่มการเพิ่ม metabox ของคุณเอง ฉันมี metabox ใหม่ที่ใช้ในตัว get_page_templates แล้วเพิ่มคนอื่น ๆ ที่ฉันต้องการโดยทางโปรแกรม ในการบันทึกนั้นสามารถอัปเดตเทมเพลตหน้าเหมือนที่ wordpress ทำ


คุณต้องการแสดงรหัสแบบเต็มหรือไม่ ปัจจุบันเป็นเพียงแนวคิดคร่าวๆ ขอบคุณ
ไกเซอร์

1

ลองใช้ hook theme_page_templatesโดยget_page_templatesฟังก์ชั่นตัวกรองที่เพิ่มเข้ามาตั้งแต่ 3.9 อัพเดทใน 4.4:

apply_filters( 'theme_page_templates', $page_templates, $this, $post );

อธิบายเพิ่มเติมอย่างเต็มที่ที่นี่: wordpress.stackexchange.com/a/255820/75495
cjbj

-2

ผลการค้นหาด้วย DuckDuckGo เพิ่มเทมเพลตหน้า WordPressเปิดขึ้นคำตอบสำหรับฉันในหน้า wpmu.org หัวข้อที่กำหนดเอง WordPress หน้าแม่แบบการสอน

เป็นหลักภายในไดเรกทอรีธีม wp-content / themes / your-themeคัดลอกเทมเพลตหน้าที่มีอยู่ไปยังชื่อไฟล์ php ใหม่ที่คุณเลือก แก้ไขไฟล์ใหม่ด้วยความระมัดระวังในการเปลี่ยนค่าคุณสมบัติ "ชื่อเทมเพลต:" ในการแสดงความคิดเห็นที่ด้านบนของไฟล์

นั่นคือทั้งหมดที่มีให้มัน เป็นไปได้ว่านี่เป็นคุณลักษณะที่โพสต์วันที่คำถาม ฉันใช้ WP 3.5 กับชุดรูปแบบที่ยี่สิบเอ็ด

อาจเป็นไปได้ว่ามีวิธีที่สะอาดกว่าในการขยายธีม การแก้ไขเช่นนี้อาจถูกเขียนทับโดยการอัพเดตธีม แม่ Culpa


ฉันต้องการวิธีแก้ไขปัญหาเพื่อเพิ่มแม่แบบลงในรายการแบบหล่นลงจากปลั๊กอินไม่ใช่ชุดรูปแบบ :(
Jared
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.