【问题标题】:Session variables lost during Ajax calls - Wordpress - Sage Starter ThemeAjax 调用期间会话变量丢失 - Wordpress - Sage Starter 主题
【发布时间】:2015-10-11 03:21:43
【问题描述】:

我正在使用入门主题 Sage 来创建自定义 Wordpress 主题。我做了一个非常简单的无限滚动系统来显示每个帖子。在这一点上,一切似乎都很好。

现在,我必须在循环中的每 N 个帖子中显示一个广告块。乍一看,这似乎很容易,但不幸的是,事实并非如此。

我的系统是这样工作的:

  1. 显示博客页面时,会显示前 N 个帖子。在该模板(模板 1)中,在循环中,我调用一个方法来检查是否必须显示广告。

  2. 当用户开始滚动时,接下来的 N 个帖子会加载 AJAX。因此,JS 调用一个 Wordpress 动作,该动作加载下一篇文章并调用适当的模板(模板 2)。在该模板中,我再次检查通过了多少帖子以及是否必须显示广告。

  3. 计数信息存储在会话变量中。

问题是这个:

页面加载完毕后,一切正常。当无限滚动第一次运行时,它仍然可以。但是,当再次调用系统时,变量 session 中存储的计数信息并不好。它们采用以前的值,就像会话变量没有增加一样。

第一次,我使用了一些静态属性和静态方法,但是没有用。所以,我认为这是因为脚本没有立即调用并且我使用了全局变量。但它也没有工作。

似乎计数工作正常,但每次加载由 AJAX 调用的模板时,会话变量都会重置为之前的值,就像它们迟到一样。

这是我使用的文件:

  • 模板1,就是主题的index.php

  • 模板2,AJAX调用的文件

  • Ajax 函数,其中包含我在 Wordpress 中需要的所有 AJAX 操作

  • 广告控制器,包含与广告块相关的所有方法

  • 具有不同 AJAX 查询的 JS 文件。

有人能告诉我我做错了什么吗?将不胜感激。

请在下面找到我的代码:

模板 1

/****************************************/
/********** TEMPLATE 1 - INDEX **********/
/****************************************/

use Roots\Sage\ThemeAdvertisementController;

$AdvertisementController = new ThemeAdvertisementController\AdvertisementController();

$_SESSION['globalCountAds'] = 0;
$_SESSION['globalArrayAds'] = '';
$_SESSION['globalCountPosts'] = 1;

get_template_part('templates/page', 'header');

while (have_posts()) {

    the_post();
    get_template_part('templates/content', get_post_type() != 'post' ? get_post_type() : get_post_format());

    $theLoopAd = $AdvertisementController->getTheLoopAds();

    if ( $theLoopAd ) {
        echo $theLoopAd;
    }

}

模板 2

/**************************************************/
/********** TEMPLATE 2 - CALLDED BY AJAX **********/
/**************************************************/

use Roots\Sage\ThemeAdvertisementController;

$AdvertisementController = new ThemeAdvertisementController\AdvertisementController();

while (have_posts()) {

    the_post();

    get_template_part( 'templates/content', get_post_type() != 'post' ? get_post_type() : get_post_format() );  

    $theLoopAd = $AdvertisementController->getTheLoopAds();

    if ( $theLoopAd ) {
        echo $theLoopAd;
    }

}

广告控制器

/**********************************************/
/********** ADVERTISEMENT CONTROLLER **********/
/**********************************************/

namespace Roots\Sage\ThemeAdvertisementController;

use Roots\Sage\ThemeViewController;
use Roots\Sage\ThemePostController;

class AdvertisementController {

    public function __construct() {

    }

    private function getTheAds() {

        $PostController = new ThemePostController\PostController();

        $postType = 'advertisement';
        $nbPosts = -1;
        $status = 'publish';
        $orderBy = 'title';
        $order = 'ASC';
        $meta = '';
        $taxQuery = '';
        $metaQuery = array(
                          array(
                              'key' => 'advertisement_in_news',
                              'value' => true,
                              'compare' => '='
                          )
                        );

        return $PostController->getThePosts( $postType, $nbPosts, $status, $orderBy, $order, $meta, $taxQuery, $metaQuery );

    }

    private function displayTheAd() {

        $ViewController = new ThemeViewController\ViewController();

        $theAdsArray = $_SESSION['globalArrayAds'];
        $theGlobalCountAds = $_SESSION['globalCountAds'];

        $thePostID = $theAdsArray->posts[ $theGlobalCountAds ]->ID;

        if ( !empty( $thePostID ) ) {

            $_SESSION['globalCountAds']++;

            $ViewController->postID = $thePostID;
            $ViewController->postType = 'advertisement';
            $ViewController->nbPosts = 1;
            $ViewController->status = 'publish';
            $ViewController->orderBy = 'ID';
            $ViewController->order = 'ASC';
            $ViewController->meta = '';
            $ViewController->taxQuery = '';

            return $ViewController->displayAdvertisementBlock();

        } else {
            return false;   
        }

    }

    public function getTheLoopAds() {

        $arrayAds = $_SESSION['globalArrayAds'];
        $adsCount = $_SESSION['globalCountAds'];
        $postCount = $_SESSION['globalCountPosts'];

        $_SESSION['globalCountPosts']++;

        if ( empty( $arrayAds ) ) {

            $theAds = $this->getTheAds();
            $_SESSION['globalArrayAds'] = $theAds; 

        }

        if ( $postCount%2 == 0 && $postCount != 0 ) {

            $displayedAd = $this->displayTheAd();

            if ( $displayedAd ) {
                return $displayedAd;
            } else {
                return false;   
            }

        } else {
            return false;  
        }

    }

}

Ajax 函数

/************************************/
/********** AJAX FUNCTIONS **********/
/************************************/

function infinitePaginateAjax() {

    $paged = $_POST['paged'];
    $postsPerPage = get_option('posts_per_page');

    $args = array( 'paged' => $paged, 
                   'post_status' => 'publish', 
                   'order' => 'DESC',
                   'post_type' => 'post',
                   'posts_per_page' => $postsPerPage
            );

    query_posts( $args );
    get_template_part('templates/loop-news');

    exit;
}

add_action( 'wp_ajax_infinitePaginateAjax','infinitePaginateAjax' );
add_action( 'wp_ajax_nopriv_infinitePaginateAjax','infinitePaginateAjax' );

function getNbPostsPerPageAjax() {

    $value = array();

    $nbPostsPerPage = get_option('posts_per_page');

    if ( !empty( $nbPostsPerPage ) ) {
        $value['answer'] = 1;    
        $value['value'] = $nbPostsPerPage;
        $value['globalCountAds'] = $_SESSION['globalCountAds'];
        $value['globalCountPosts'] = $_SESSION['globalCountPosts'];
    } else {
        $value['answer'] = 0; 
        $value['value'] = 0;
    }

    $data = json_encode( $value );

    die( $data );

}

add_action( 'wp_ajax_getNbPostsPerPageAjax','getNbPostsPerPageAjax' );
add_action( 'wp_ajax_nopriv_getNbPostsPerPageAjax','getNbPostsPerPageAjax' );

function getTotalPostsAjax() {

    global $wp_query;
    $value = array();

    $nbPosts = wp_count_posts( 'post' );
    $nbPublishedPosts = $nbPosts->publish;

    if ( !empty( $nbPublishedPosts ) ) {
        $value['answer'] = 1;    
        $value['value'] = $nbPublishedPosts;
        $value['globalCountAds'] = $_SESSION['globalCountAds'];
        $value['globalCountPosts'] = $_SESSION['globalCountPosts'];
    } else {
        $value['answer'] = 0; 
        $value['value'] = 0;
    }

    $data = json_encode( $value );

    die( $data );

}

add_action( 'wp_ajax_getTotalPostsAjax','getTotalPostsAjax' );
add_action( 'wp_ajax_nopriv_getTotalPostsAjax','getTotalPostsAjax' );

JS

jQuery(document).ready(function() {


    var pageInfinite = '.infinite-page';
    var loaderInfinite = '.infinite-loader';
    var contentInfinite = '.main-content';

    var getTotalPosts = function() {

        var totalPosts = '';

        jQuery.ajax({
            type : "POST",
            contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
            async: false,
            url : data_sage_js.ajaxurl,
            data: { 
                action: 'getTotalPostsAjax'
            },
            success: function( data ) {

                data = jQuery.parseJSON( data );

                if ( data.answer !== 0 ) {
                    totalPosts = data.value;    

                }  else {
                    totalPosts = 0;
                }

            },
            error: function () {

                console.log( 'error: cannot get nb posts' );
                totalPosts = 0;

            }

        }); 

        return totalPosts;

    };

    var getNbPostsPerPage = function() {

        var postsPerPage = '';

        jQuery.ajax({
            type : "POST",
            contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
            async: false,
            url : data_sage_js.ajaxurl,
            data: { 
                action: 'getNbPostsPerPageAjax'
            },
            success: function( data ) {

                data = jQuery.parseJSON( data );

                if ( data.answer !== 0 ) {
                    postsPerPage = data.value;

                }  else {
                    postsPerPage = 0;
                }

            },
            error: function () {

                console.log( 'error: cannot get max posts page' );
                postsPerPage = 0;

            }

        }); 

        return postsPerPage;

    };

    var infiniteLoadArticle = function( pageNumber ) { 

        jQuery( loaderInfinite ).show( 'fast' );

        setTimeout(function(){

            jQuery.ajax({
                type:'POST',
                contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
                async: false,
                url: data_sage_js.ajaxurl,
                data: { 
                    action: 'infinitePaginateAjax',
                    paged: pageNumber
                },
                success: function( html ) {
                    jQuery( loaderInfinite ).hide( 'fast' );
                    jQuery( contentInfinite ).append( html);
                }
            });

        }, 1000);

        return false;

    };

    if ( jQuery( pageInfinite ).length > 0 ) {


        var postsTotal = parseInt( getTotalPosts() );
        var incPost = parseInt( getNbPostsPerPage() );
        var postsCount = parseInt( incPost );
        var nbPage = parseInt( 1 );
        var nbTotalPage = parseInt( Math.ceil( postsTotal / incPost ) );

        jQuery(window).scroll(function() {

            if ( jQuery(window).scrollTop() === jQuery(document).height() - jQuery(window).height() ) {

                if ( nbTotalPage > nbPage ) {

                    nbPage++;

                    infiniteLoadArticle( nbPage );

                    postsCount = postsCount + incPost;

                } else if ( nbTotalPage <= nbPage ) {

                    return false;

                }

            }

        });
    }

});

编辑/解决

因此,经过数小时的搜索,我决定采用另一种方式:我决定使用“posts_per_page”属性来统计帖子并知道何时必须显示广告。我只需要重构一些函数和方法。

【问题讨论】:

    标签: php ajax wordpress session


    【解决方案1】:

    会话变量是否在 Ajax 调用之外工作?在页面刷新等方面。

    如果他们不这样做,那么这可能与 wordpress 可以非常奇怪地处理会话变量的事实有关。

    我认为它是出于安全考虑,但如果在您的 php.ini 中,如果 'register_globals' 位于它上面,则会取消注册所有 php 全局变量。

    参考:WP_unregister_GLOBALS

    在这种情况下,我相信https://wordpress.org/plugins/wp-session-manager/ 之类的东西会为此填空,或者你可以在你的 php.ini 中关闭 register_globals(虽然我不明白这样做的后果很抱歉

    【讨论】:

    • 如果我能很好地理解您的问题,我可以在任何地方创建var_dump($_SESSION); 并查看变量会话。我想知道我是否必须在 Wordpress 中授权新的会话变量,就像您使用 query_vars() 添加查询变量一样,但我没有找到任何相关信息。
    猜你喜欢
    • 2014-04-18
    • 2011-11-06
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    • 2012-08-17
    • 2011-12-05
    • 2011-03-09
    相关资源
    最近更新 更多