我可以在WordPress自定义页面中设置会话吗

时间:2014-11-07 作者:Suffii

我正在尝试为我的自定义WP主题的Fornt最终用户设置登录系统和联系表单。我需要创建一些Ajax Post方法,并将输入值发送到服务器(如Captcha)和用户输入值(如Captcha、姓名、电话、电子邮件等)。。。现在我的问题是,我是否必须创建PHP会话来保护不需要的表单提交或在两个页面之间传递captcha值?

如果是,这是联系人页面和验证码页面的正确页面模板吗

<?php
session_start();
/*
 Template Name: Contact Page
*/
验证码。php

<?php
session_start();
谢谢

2 个回复
最合适的回答,由SO网友:iyrin 整理而成

是的,您可以这样做,但除非挂接到init或admin\\u init(或在发送标头之前的其他位置),否则您将收到有关已发送标头的错误。我还没有对其进行测试,但您可以将会话函数挂接到send_headers 行动1 这似乎是自会话以来最合适的位置,因为它最终将发送头。

在模板页面上,如果您在调用之前启动会话,我认为它会起作用get_header().

下面是我之前构建的插件的一个示例。

设置会话:

// Must run session_start() during admin_init to use $_SESSION variables later
add_action(\'admin_init\',\'register_session\');

function register_session() {
      if( !session_id()
        && current_user_can( \'manage_options\' )
        && current_user_can( \'client_tools\' )  )
      session_start();
      session_unset();
}
这是一个函数的一部分,用于在需要会话变量的地方设置它们。

// Update notifications
add_action( \'admin_post_mmc_update_notification\', \'mmc_update_notification\' );

function mmc_update_notification() {
        //Check the nonce
        check_admin_referer( \'mmc_notification_nonce\' );

        // Set a session variable
        if ( isset( $_POST[ \'client-manager-lname\' ] ) )
            $_SESSION[\'client-manager-lname\'] = $_POST[\'client-manager-lname\'];

}
这允许我在该插件的子菜单页上使用这些会话变量,如下所示:

//Define variables to be used in search results. Make sure each is set first.
if( isset($_SESSION[\'client-manager-lname\'])
&& $_SESSION[\'client-manager-lname\'] != \'\' ) {
$last_name = $_SESSION[\'client-manager-lname\'];
}
当不再需要时,可以在脚本末尾取消设置会话变量unset ($_SESSION[\'varname\']);. 所有会话变量都可以用session_unset(); 如果您需要确保为每个会话设置新的变量,而没有之前会话的剩余内容,那么最好在会话开始后立即运行。

使用销毁会话session_destroy();.

我建议阅读PHP: session_unset - Manual.

更新:我更仔细地研究了您考虑使用PHP会话的原因,并看到了混合Web开发人员的答案。当您的用户通过登录(验证)时,可以选择记住凭据wp_signon()2.

如上所述,始终使用wp_nonce_field()3 并使用wp_verify_nonce()4 在表单处理脚本中。

我碰巧在WordPress中看到一篇关于Cookie和PHP会话的好文章,其中概述了一些依赖$\\u会话变量的缓存和安全相关问题。Other Stuff Archives - WP Engine

总而言之,似乎最好尽可能避免在WordPress中使用PHP会话。在某些情况下,最好通过瞬态API存储临时数据5.

SO网友:Hybrid Web Dev

会话对于让数据在页面之间持久化非常有用。

如果您使用的是ajax调用,那么您根本不需要会话,因为您可以轻松地动态传递解析/传递数据,包括其他模板/文件。注意,WP有一个内置的ajax处理系统。如果你对它不熟悉,我建议你检查一下WP codex。

至于保护不需要的提交,除了验证和清理/检查每个用户输入之外,您绝对应该始终使用nonce。使用白名单与黑名单的方法进行验证将为您省去很多麻烦,通常会使生活更轻松。

结束

相关推荐

Sessions in word press

是否可以在wordpress中设置会话。如果是,你能告诉我怎么做吗?我的示例代码是。<?php session_start(); if(!isset($_SESSION[\'impression\'])) { $_SESSION[\'impression\'] = 100; }else { if($_SESSION[\'impression\']<=0) $_SESSION[\'impression\