static array on functions.php

时间:2018-11-21 作者:Asaf Moshe

在函数中。php中,我想访问数据库一次,以获取一个ACF对象,然后在本地“保存”它,以防止对数据库的进一步请求。

我想首先在“init”钩子中调用以下函数。

然后,假设,当我在以后的挂钩上调用它时,由于使用了“static”关键字,$current\\u store var已经设置好了,函数将在第一个“if”返回已经保存的静态var时停止。

它不起作用-当访问稍后挂钩上的函数时,“isset($current\\u store)”返回false。

我做错了什么?

function get_current_store()
{
    if (isset($current_store)) {
        return $current_store;
    }

    $store_url_parts = explode(\'.\', $_SERVER[\'HTTP_HOST\']);
    $store_subdomain = $store_url_parts[0];

    $store_url_parts_reversed = array_reverse($store_url_parts);

    if (in_array("il", $store_url_parts_reversed)) {
        $domain = $store_url_parts_reversed[2];
    } else {
        $domain = $store_url_parts_reversed[2];
    }

    if ($store_subdomain == $domain) {
        $current_store = \'main\';

        return $current_store;
    }

    if ($stores_page = get_page_by_title(\'Stores\', OBJECT, \'option\')) {
        $stores_page_id = $stores_page->ID;

        if (function_exists(\'have_rows\')) {
            if (have_rows(\'stores\', $stores_page_id)) {
                $store_url_parts = get_store_url_parts();
                $store_subdomain = $store_url_parts[0];
                $stores          = array();

                while (have_rows(\'stores\', $stores_page_id)) {
                    the_row();

                $store = get_row(true);

                    $stores[] = $store;
                }

                $subdomains = array_column($stores, \'store_subdomain\');

                $current_store_id     = array_search($store_subdomain, $subdomains);

                static $current_store = array();

                if ($current_store_id !== false) {
                    $current_store = $stores[$current_store_id];
                } else {
                    $current_store = false;
                }

                return $current_store;
            }
        }
   }
}

3 个回复
SO网友:Jacob Peattie

这是Object Cache:

WP\\u Object\\u Cache是WordPress的一个类,用于缓存重新生成数据的计算开销,例如复杂数据库查询的结果。

您可以使用wp_cache_set() 并用wp_cache_get(). 您只需为其指定一个键和值,以及主题/插件或一组功能所特有的组名,以避免冲突:

function get_current_store()
{
    // Check if the current store is cached.
    $cache = wp_cache_get( \'current_store\', \'my_plugin\' );

    // If it is, return the cached store.
    if ( $cache ) {
        return $cache;
    }

    // Otherwise do the work to figure out $current_store;

    // Then cache it.
    wp_cache_set( \'current_store\', $current_store, \'my_plugin\' );

    return $current_store;
}
不管你跑了多少次get_current_store() 在一个页面上,它只会生成当前store变量一次。

SO网友:Asaf Moshe

雅各布·皮蒂的回答是一个很好的选择。

但是如果有人休息了,我的原始代码的问题是static $current_store 需要在函数开始时声明。

此代码适用于:

function get_current_store()
{
    static $current_store;

    if (isset($current_store)) {
        return $current_store;
    } else {
        $store_url_parts = explode(\'.\', $_SERVER[\'HTTP_HOST\']);
        $store_subdomain = $store_url_parts[0];

        $store_url_parts_reversed = array_reverse($store_url_parts);

        if (in_array("il", $store_url_parts_reversed)) {
            $domain = $store_url_parts_reversed[2];
        } else {
            $domain = $store_url_parts_reversed[2];
        }

        if ($store_subdomain == $domain) {
            $current_store = \'main\';

            return $current_store;
        }

        if ($stores_page = get_page_by_title(\'Stores\', OBJECT, \'option\')) {
            $stores_page_id = $stores_page->ID;

            if (function_exists(\'have_rows\')) {
                if (have_rows(\'stores\', $stores_page_id)) {
                    $store_url_parts = get_store_url_parts();
                    $store_subdomain = $store_url_parts[0];
                    $stores          = array();

                    while (have_rows(\'stores\', $stores_page_id)) {
                        the_row();

                        $store = get_row(true);

                        $stores[] = $store;
                    }

                    $subdomains = array_column($stores, \'store_subdomain\');

                    $current_store_id = array_search($store_subdomain, $subdomains);

                    $current_store = array();

                    if ($current_store_id !== false) {
                        $current_store = $stores[$current_store_id];
                    } else {
                        $current_store = false;
                    }
                }
            }
            return $current_store;
        }
    }
}

SO网友:Greg Winiarski

如果$current\\u store是某种全局变量,那么函数应该从

function get_current_store() {
    global $current_store
    // the rest of your source code here ...

结束

相关推荐

自定义登录页面始终重定向到wp-login.php

我已经创建了一个自定义登录页面,用户可以在其中登录我的网站,但当我尝试登录时,它会重定向到wp登录。php和我必须输入reCAPTCHA(我讨厌这些!)。我已经尝试重新登录wp。php到我的自定义登录页面,这是可行的,但结果是,现在我处于一个无限循环中,重定向到同一个自定义登录页面,而无法实际登录。我该怎么做?EDIT我的自定义登录页面与此完全相同:<?php get_header(); ?> <div class=\"container\"> <div cl