创建自定义静态页面的正确方法

时间:2013-01-02 作者:akTed

我对WordPress相当陌生。我正在创建一个带有表单的页面。这是可行的,但由于太新了,我想知道我是否用了最好的方式。我将使用“二十一”作为示例主题。

“复制”页。php(我们将使用“xxx.php”作为新的模板页面名称)

  • \'require\'我的类文件(处理绘制表单、处理$\\u POST等)并创建实例
  • 在“the\\u content()”的正下方,调用my class方法,该方法在处理$\\u POST后绘制表单或显示输出
  • 使用“我的模板”在admin中创建一个新页面,那么,这是我尝试做的事情的“正常”方式,还是有更好的方式?另外,我应该在哪里存储类文件和相关的css/js?如果我将它们存储在主题目录中,我必须记住在删除主题之前移动它们。

  • 5 个回复
    最合适的回答,由SO网友:Milo 整理而成

    如前所述,您的方式是可行的,但有一些方法可以将表单与模板解耦,从而允许更大的灵活性。

    这个Shortcode API 允许您为表单创建一个快捷码,因此您只需输入以下内容[my_form] 在页面内容中,然后在处理短代码的函数中,可以呈现表单并将必要的脚本排队。对于CSS,您可以在呈现模板之前挂接一个操作,以对请求页面的内容执行一些正则表达式,查看它是否包含短代码,因此您只能在需要时将样式表排队。

    一般来说,您应该熟悉filtersactions, 这些是你想在WordPress中做的所有事情的基础。例如,要处理表单数据,可以将操作添加到init 检查POST变量是否存在,并执行您需要执行的任何处理、数据库写入、重定向等操作,使表单独立于其呈现的模板或页面,或者您可以filter the_content 检查当前请求的页面并以这种方式呈现表单。

    SO网友:woony

    这是一种可以接受的方法,如果可行的话,它就可以正常工作:)。

    但如果你不想让事情依赖于“模板”。回答“放在哪里”。您最好为表单创建一个插件。这样,您就可以将表单添加到所需的任何页面。。所以这取决于你的需要。

    如果你正在为自己制作一个完全定制的主题,我相信最好的方法就是保持你对它最满意的方式。或者这是为了自由精神

    SO网友:Ed Burns

    正如woony所说,这是一种有效的方式,但它确实将您的页面与表单与主题联系起来。有一些不错的插件可以很容易地在页面上提供表单。

    我知道Wordpress Jetpack(免费)有一个简单的联系方式,通常可以完成工作。

    还有重力形态(付费),它提供了太阳下几乎所有可能的特征。

    至于样式,因为样式是一个主题概念,所以将表单样式放在主题中不是问题。请记住,您进行了定制,如果切换了主题,您将需要向样式表中添加新的表单样式(并且可能无论如何都要添加)。

    SO网友:Chip Bennett

    我将对现有的优秀答案补充几点想法:

    我建议使用约定命名模板文件template-foobar.php. 这样做有助于将其与其他模板和模板零件文件区分开来

    <?php
    /** 
     * Template Name: Foobar Form
     */
    
    get_header();
    
    // Your custom code goes here
    
    get_footer();
    
    假设您正在使用自己的主题(或子主题,如您修改了212的示例),您可以将功能代码添加到functions.php, 可以直接在文件中,也可以通过包含的文件。

    如果您希望此代码在特定主题之外可用,那么您可能希望通过插件实现代码。在这种情况下,您可能根本不想使用自定义页面模板,而是想看看如何使用自定义短代码if ( function_exists() ) 有条件的

  • 您可以在插件中定义自定义页面模板,然后在上使用回调template_redirect, template_include, 或page_template 确定何时使用它(例如,基于特定的页面slug,或者更好的是,通过插件定义的自定义post meta)

    在插件中,您需要为静态页面定义自定义post meta:

    function wpse77991_add_meta_boxes( $post ) {
    
        add_meta_box( 
            \'wpse77991_display_form\', 
            __( \'Display Form\', \'textdomain\' ), 
            \'wpse77991_display_form_meta_box\', 
            \'page\', 
            \'side\', 
            \'default\' 
        );
    
    }
    // Hook meta boxes into \'add_meta_boxes_page\'
    add_action( \'add_meta_boxes_page\', \'wpse77991_add_meta_boxes\' );
    
    然后,定义回调:

    function wpse77991_display_form_meta_box() {
        global $post;
    
        $custom = ( get_post_custom( $post->ID ) ? get_post_custom( $post->ID ) : false );
        $display_form = ( isset( $custom[\'_wpse77991_display_form\'][0] ) ? \'true\' : \'false\' );
    
        <input type="checkbox" name="_wpse77991_display_form" <?php checked( \'true\' == $display_form ); ?> value="true" /> 
        <label><?php _e( \'Display Form?\', \'textdomain\' ); ?></label>
    }
    
    然后,定义保存后回调:

    function wpse77991_save_display_form_meta_data() {
        global $post;
    
        $custom = ( get_post_custom( $post->ID ) ? get_post_custom( $post->ID ) : false );
        $display_form = ( isset( $_POST[\'_wpse77991_display_form\'][0] ) ? \'true\' : \'false\' );
    
        update_post_meta( $post->ID, \'_wpse77991_display_form\', $display_form );
    }
    add_action( \'publish_page\', \'wpse77991_save_display_form_meta_data\' );
    add_action( \'draft_page\', \'wpse77991_save_display_form_meta_data\' );
    
    现在,编辑帖子页面将显示静态页面的元框,允许用户选中复选框“显示表单”。

    然后,您可以在回调中查询该自定义元数据template_redirect, template_include, 或者更好,page_template:

    function wpse77991_page_template_include( $template ) {
        global $post;
    
        $custom = ( get_post_custom( $post->ID ) ? get_post_custom( $post->ID ) : false );
        $display_form = ( isset( $custom[\'_wpse77991_display_form\'][0] ) ? \'true\' : \'false\'
    
        if ( \'true\' == $display_form ) {
            return( plugin_dir_path( __FILE__ ) . \'template-foobar.php\' );
        }
    }
    add_filter( \'page_template\', \'wpse77991_page_template_include\', 1, 1 );
    
    以上所有代码都是未经测试的代码,在这里用作流程的概念证明。

  • SO网友:akTed

    感谢大家花时间回复,尤其是woony&;米洛把我带上了我最终选择的道路——一个插件。更具体地说,是一个mu插件。当我开始使用短代码路径时,我决定过滤\\u内容。

    我在过滤它时遇到的唯一障碍是,我的表单是在它自己的文件标准html中,并穿插了PHP。要求(在过滤器中)将在<;之后立即输出;正文>和\\u内容后的

    我在表单上尝试了file\\u get\\u内容。php,但这不允许在其中回显php变量。我不想把它串起来,因为它是一个很长的表单——我讨厌在PHP字符串中编辑HTML。然后我偶然发现ob_start, 我听说过,但直到现在都没用过。以下是我最终得出的结论:

    首先,完整的mu插件代码:

    // exit plugin if not on the page I want to output to
    if ( $_SERVER[\'SCRIPT_URL\'] != \'/option-page-starter/\' ) return;
    
    // instantiate class; __construct either handles the $_POST or initializes form vars
    require(\'ops/class.php\');
    $akt_ops = new akt_opsForm();
    
    add_filter(\'the_content\', array($akt_ops, \'output\'));
    
    以及$akt_ops->output (为清晰起见,缩写)

    ob_start(); // buffer output
    require(\'form.php\');
    $text .= ob_get_contents(); // $text is the_content; copy from buffer to string now that it\'s correctly populated with my vars
    ob_end_clean(); // cancel the buffered content
    return $text;
    
    这个解决方案比我在主题中的最初想法要好得多。更改主题时维护太多。现在,如果我决定更改主题,我所要做的就是修复CSS。

    P、 我是StackExchange的新员工。我想我选择了让它每3小时给我发一份答案摘要,但没有收到任何回复的电子邮件。如何订阅我创建的问题,以便在有人回答时通知我?

    结束

    相关推荐