为什么我一直重定向到错误的帖子使用会话在WordPress?



我正在制作一个WordPress插件,允许用户在前端创建一个帖子,然后自动重定向到他们刚刚创建的帖子。我必须使用两个单独的函数和一个会话变量来实现这一点,因为在发送报头之后不能使用wp_redirect。我遇到的问题是会话变量没有发送刚刚创建的帖子的永久链接,而是发送上一个帖子的永久链接。

当用户提交表单

时初始化下面的函数
function create_post(){

if(is_user_logged_in())
{
if(isset($_POST['ispost']))
{

global $current_user;
get_currentuserinfo();
$user_login = $current_user->user_login;
$user_email = $current_user->user_email;
$user_firstname = $current_user->user_firstname;
$user_lastname = $current_user->user_lastname;
$user_id = $current_user->ID;
$post_title = $_POST['title'];
$sample_image = $_FILES['sample_image']['name'];
$post_content = $_POST['sample_content'];
$category = $_POST['category'];
$new_post = array(
'post_title' => $post_title,
'post_content' =>$post_content,
'post_status' => 'publish',
'post_type' => $post_type,
'post_category' => $category
);

$pid = wp_insert_post($new_post);
add_post_meta($pid, 'meta_key', true);
$_SESSION['pid'] = get_post_field( 'post_name', $pid );
if (!function_exists('wp_generate_attachment_metadata'))
{
require_once(ABSPATH . "wp-admin" . '/includes/image.php');
require_once(ABSPATH . "wp-admin" . '/includes/file.php');
require_once(ABSPATH . "wp-admin" . '/includes/media.php');
}
if ($_FILES)
{
foreach ($_FILES as $file => $array)
{
if ($_FILES[$file]['error'] !== UPLOAD_ERR_OK)
{
return "upload error : " . $_FILES[$file]['error'];
}
$attach_id = media_handle_upload( $file, $pid );
}
}
if ($attach_id > 0)
{
//and if you want to set that image as Post then use:
update_post_meta($pid, '_thumbnail_id', $attach_id);
$_SESSION['pid'] = $pid->post_name;

}
$my_post1 = get_post($attach_id);
$my_post2 = get_post($pid);
$my_post = array_merge($my_post1, $my_post2);


}

}
else
{
echo "<h2 style='text-align:center;'>User must be login for add post!</h2>";
}
}

这个函数应该将用户重定向到刚刚在init

上创建的post
add_action('init', 'myInit');
function myInit() {
if (isset($_POST['ispost'])) {
$errors = myFormValidation();
if (empty($errors)) {

// echo get_permalink($pid);
$url = 'https://somethingsomething.com/'. $_SESSION['pid'];
wp_redirect($url);


}
//Set the errors here
}
}

我如何使$_SESSION['pid']发送当前帖子的永久链接而不是前一个?

可能重定向到错误的位置,因为myInit()函数在create_post()函数之前运行。

wp_redirect

需要在呼叫wp_redirect();后立即添加exit(),否则会出现意想不到的结果。

重定向用户

你可以这样做:

  1. 尝试在发送报头之前处理表单,并使用wp_redirect()重定向用户。

我想这在理论上是可行的,但可能并不理想,因为我假设create_post()函数是用admin_post_(action)钩子处理的,该钩子在之后运行发送报头。

  1. 使用JavaScript将用户重定向到之后

您可以在处理完表单后使用JavaScript重定向用户。

echo '<script type="text/javascript">';
echo 'window.location = "' . $url . '"';
echo '</script>';

我最终为所有输入创建会话变量,然后在链接页面加载并工作后创建帖子。然后,我使用JavaScript重定向到新创建的帖子。

if(is_user_logged_in())
{
if(isset($_POST['ispost']))
{
global $current_user;
get_currentuserinfo();
$user_login = $current_user->user_login;
$user_email = $current_user->user_email;
$user_firstname = $current_user->user_firstname;
$user_lastname = $current_user->user_lastname;
$user_id = $current_user->ID;

$_SESSION['post_title']=$_POST['title'];
$_SESSION['sample_image']=$_FILES['sample_image']['name'];
$_SESSION['post_content']=$_POST['sample_content'] . do_shortcode('[wpstream_go_live]'); 
// do_shortcode('[wpstream_go_live id="12"]'); 
$_SESSION['post_category']=$_POST['category'];
//$post_title = $_POST['title'];
//$sample_image = $_FILES['sample_image']['name'];
//$post_content = $_POST['sample_content'];
//$category = $_POST['category'];
}
}

add_action('loop_end', 'myInit');
function myInit() {
if (isset($_POST['ispost'])) {
$errors = myFormValidation();
if (empty($errors)) {
echo $_SESSION['post_title'];
$new_post = array(
'post_title' => $_SESSION['post_title'],
'post_content' => $_SESSION['post_content'] . $_SESSION['post_category'],
'post_status' => 'publish',
'post_type' => $post_type,
'post_category' =>array($_SESSION['post_category']) 
);
$pid = wp_insert_post($new_post);
add_post_meta($pid, 'meta_key', true);

$url= get_permalink($pid);
echo '<script type="text/javascript">';
//echo 'alert("' . $pid . '")';
echo 'window.location = "' . $url . '"';
echo '</script>';    

//echo do_shortcode('[wpstream_go_live id="12"]');

$_SESSION['pid'] = $pid;
$url= "www.google.com";

if (!function_exists('wp_generate_attachment_metadata'))
{
require_once(ABSPATH . "wp-admin" . '/includes/image.php');
require_once(ABSPATH . "wp-admin" . '/includes/file.php');
require_once(ABSPATH . "wp-admin" . '/includes/media.php');
}
if ($_FILES)
{
foreach ($_FILES as $file => $array)
{
if ($_FILES[$file]['error'] !== UPLOAD_ERR_OK)
{
return "upload error : " . $_FILES[$file]['error'];
}
$attach_id = media_handle_upload( $file, $pid );
}
}

if ($attach_id > 0)
{
//and if you want to set that image as Post then use:
update_post_meta($pid, '_thumbnail_id', $attach_id);
$_SESSION['pid'] = $pid;

}

$my_post1 = get_post($attach_id);
$my_post2 = get_post($pid);
$my_post = array_merge($my_post1, $my_post2);
}
} else {
echo "<h2 style='text-align:center;'>User must be login for add post!</h2>";
//echo do_shortcode('[wpstream_go_live id="12"]');
echo PLUGIN_DIR;
}
}

最新更新