什么时候使用过滤器,动作和WordPress中的正常功能?

时间:2016-04-20 15:11:03

标签: php wordpress wordpress-theming

我一直在阅读过去一小时的行动和过滤器,但我仍然无法找到我想要的答案。

假设我有一个关于2个城市的WP主题/网站。伦敦和华盛顿。这两个是每个其他页面的顶级父页面。 (关于,访问什么,信息等)每个城市的某些内容是不同的。

例如:

  • 在页脚中我们显示每个儿童页面的城市名称。
  • 在3个div(内容加载WP_Query
  • 的首页上宣传了内容
  • 不同城市的不同标题颜色

这个内容没有存储在数据库中,所以我虽然在functions.php文件中创建了一个简单的函数,就像这样(简化,当我得到slug时我也遗漏了部分):

function cityData () {
    $currentCitySlug = 'xx';//code that finds top parent & returns 'london' or 'washington';
    switch ($currentCitySlug ) {
        case 'london':
        $smth['footer'] = 'London';
        $smth['frontpage-featured'] = array(190,200,201); //post IDs
            break;

        default: //washington
                $smth['footer'] = 'Washington';
                $smth['frontpage-featured'] = array(150,154,167);
            break;
    }
    return $smth;
}

所以这就是我不能得到的:

  1. 我应该在哪里调用cityData(),以便返回的变量在我的主题中随处可用?我是否使用一些全局变量数组,比如说index.php,然后是header.php等,或者我需要它的任何地方(然后在页脚中说回声$somecity['footer'])?我读过我们应该避免全局变量。

  2. 我应该执行此功能吗?几乎所有指南都说动作不返回变量,但https://codex.wordpress.org/Plugin_API#Create_an_Action_Function中的示例显示了返回变量的函数。这让我很困惑。当动作不返回变量时,返回此变量的位置和原因?还有,把它挂钩到什么WordPress动作? initafter_setup_theme?这些行动有数百万,如何知道哪一个?如果你可以从动作返回变量那么为什么甚至使用过滤器?

  3. 我的猜测是我需要使用过滤器。然而,这是我的主要困境:我应该使用过滤器OR我应该只使用普通函数调用:

    $city = cityData();
    echo $city['footer'];
    
  4. 每次我在主题中都需要这个数组?

    或者我应该在functions.php中对此函数使用add_filter,然后每当我需要数组中的某些数据时,在我的主题中使用apply_filters函数调用它?这是一个非常简单的功能,为什么使用过滤器而不是正常功能?

    1. 如何调用此函数(或应用过滤器)并将此变量设置为,然后只需在我的代码中的任何位置需要它时,就像$city['somesubfield']一样回复它?这比我每次需要时使用过滤器或调用功能更好吗?
    2. 我有一种感觉,我完全错误地完成了这一点。也许我甚至应该将自定义字段添加到顶级父页面(伦敦,华盛顿),然后直接从数据库中获取这些数据?但是,这可能会在不需要时进行额外的数据库调用。

      如果您必须为2个城市存储一些额外的数据,您会在哪里存储它?请记住,这些附加数据不仅在显示这两个页面时需要,而且还适用于这两个首页的每个子页面。手动功能?在数据库中,这些2页的自定义字段是否在每次需要时从DB读取?在某些特殊的数据库领域,喜欢选项?每个城市需要存储的项目不超过5个。

1 个答案:

答案 0 :(得分:0)

我不确定我是否完全理解,但无论如何我都会尝试至少帮助你解决一些问题。首先,您不需要全局变量。它似乎对我来说就像你可以通过正常函数传递参数来得到你想要的东西。因此,例如,您可以为函数提供参数'london''footer',并让该函数为您提供伦敦的页脚值。

而且,函数不会返回变量,但它们可以返回值。当你调用这个函数时......

function hello_world() {
    $x = 'Hello world!';
    return $x;
}

......无论$x是什么价值,它都会返回。它将返回文字字符串 'Hello world!' - 而非$x作为变量,以便在全局范围内的代码中使用。

无论如何,我认为这是你可以尝试做的事情的一种方式。

/**
 * Find top parent and return 'london' or 'washington' (Based on what you said, this is sounding to me like this could/should be a function all on its own.)
 */
function get_citySlug() {
    $slug = 'xx'; // Remember when you said you left out the part where you get the city slug? Well, you could put that here.
    return $slug;
}

/**
 * Return requested information based on specified city
 */
function cityData($city, $output) {
    // $currentCitySlug = 'xx'; // This has been turned into its own function (see get_citySlug() above). I left this comment in here so you can see what's going on, but you can remove it.

    // Define data based on given city
    switch ($city) {

        case 'london':
            $footer    = 'London';
            $frontpage = array(190,200,201); //post IDs
            break;

        case 'washington':
            $footer    = 'Washington';
            $frontpage = array(150,154,167);
            break;

        // If there's no case for the given city, then there's no point in continuing this function. Leave the function and return with nothing.
        default:
            return;
    }

    // Rerturn data based on given output
    switch ($output) {

        case 'footer':
            return $footer;
            break;

        case 'frontpage-featured':
            return $frontpage;
            break;

        // If there's no case for the given output, return with nothing.
        default:
            return;
    }
}

调用这些函数(与全局变量对比)

现在,您可以调用cityData()并通过它传递参数。 (您可以在代码中的任何位置使用它,并且无需全局变量即可完成此操作。)

echo cityData('london','footer'); // echoes: London

请注意,如果您在get_citySlug()实际上动态返回城市段落的位置进行设置,您可以将get_citySlug()传递给cityData(),这样的情况(这样的情况是很好的理由)那个城市slug就像我们自己的功能一样。)

echo cityData(get_citySlug(),'footer');

主题' functions.php vs插件

我会这样说(即使看起来你可能已经意识到这一点),因为听起来这些功能对你的网站来说非常重要。虽然将函数放入functions.php 工作,但如果您决定停用主题,这些函数也将被停用。如果这些功能与您网站的性质密切相关,而不仅仅是为了展示,您可以考虑使用writing a plugininstalling a plugin作为自定义网站功能。

替代建议

或许可以按照自己的方式提出更多想法,您可能会考虑的一些事情是custom post typespage templates

至于从函数中返回数组,我知道你已经触及过这种方法,但我仍然会列出它。

如果需要,您还可以使用class并从那里提取变量。

同样,我并不完全确定你要特别实现的目标,所以我可能没有涵盖你所希望的所有内容,而且我无法真正地与{{3部分适合您的情况或给出具体的"应该"或者"不应该"#34;对你而言,但我希望我已经给了你(或任何人)至少一些有用的东西或者朝着正确的方向努力。