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

问题描述 投票:0回答:2

我正在制作一个 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 上创建的帖子

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'] 发送当前帖子的永久链接而不是上一篇?

php wordpress session http-redirect
2个回答
0
投票

重定向可能会到达错误的位置,因为

myInit()
函数在
create_post()
函数之前运行。

wp_重定向

您需要在调用

exit()
后立即添加
wp_redirect();
,否则您会得到意想不到的结果。

重定向用户

您可以执行以下操作。

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

我想这在理论上是可行的,但可能并不理想,因为我假设

create_post()
函数是用
admin_post_(action)
钩子处理的,该钩子在发送标头之后运行

  1. 发送标头后使用 JavaScript 重定向用户。
您可以使用 JavaScript 处理表单后重定向用户。

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

0
投票
我最终为所有输入创建了会话变量,然后在链接页面加载并工作后创建了帖子。然后我使用 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; } }
    
© www.soinside.com 2019 - 2024. All rights reserved.