小工具级别的A/B测试选项

时间:2015-11-15 作者:Jason

我正在寻找一种方法来显示我的网站主页上的3个不同的小部件之一。我可以用javascript实现这一点,但这会增加页面的重量,我宁愿在渲染时实现(本机wp或php解决方案)。

解决方案不必是真正的a/B测试(所选的小部件不必保持对用户IP的持久性)。

从一系列可用的小部件中呈现单个小部件的选项是什么?

编辑(澄清)-在页面加载时,我希望从小部件数组(列表)中显示单个小部件。例如,在我主页的“英雄”小部件区域中,我想在用户访问主页时显示单个小部件-[图像旋转器、特色帖子滑块或地图]。

1 个回复
最合适的回答,由SO网友:Pieter Goosen 整理而成

使用sidebars_widget 滤器

我们要做的是,在后端,将我们的三个小部件添加到所需的侧栏中。这将一如既往地按照所有小部件在边栏后端的显示顺序显示它们。

如果你只在主页上需要它,那么注册一个侧栏,然后有条件地(is_home())将其包含在模板中。

无论如何,我们现在将使用sidebars_widget 筛选以随机删除我们添加的三个侧栏中的两个。这将给您留下一个随机的小部件。但必须注意的是,您可能会在新页面加载上显示相同的小部件,因为任何随机的内容都无法控制。在三个数字中,随机选择两个,总是有可能再次选择相同的两个数字。如果您需要对此进行更多的控制,那么您需要更改特定的代码段,并以某种方式实现另一个更可靠的系统来处理此问题

这是代码,我已经对其进行了注释,因此您可以轻松地遵循它,并根据需要进行修改。只需注意,更改sidebar-2 精确到ID 您需要瞄准的侧边栏的

add_filter( \'sidebars_widgets\', function ( $sidebars_widgets )
{
    // Return our filter when we are on admin screen
    if ( is_admin() )
        return $sidebars_widgets;

    /**
     * We only want to target only the homepage, so return if it is not homepage
     * You would want to register the sidebar also only on the homepage, otherwise you would
     * need to extend the function to remove the widgets on any other page
     */
    if ( !is_home() )
        return $sidebars_widgets;

    // The ID of the sidebar you want to target
    $sidebar_id_to_target = \'sidebar-2\';

    foreach ( $sidebars_widgets as $key=>$sidebars_widget ) {
        // Skip a sidebar if it it isn\'t our $sidebar_id_to_target
        if ( $key != $sidebar_id_to_target )
            continue;

        // Count the amount of widgets in the desired sidebar
        $counter = count( $sidebars_widget );

        // If the count is 0 or 1, return early
        if ( $counter <= 1 )
            break;

        /**
         * We now want to select a random widget, which will be a random array key
         * We would also need to unset the other two
         */
        $random_numbers = array_rand( range( 0, ( $counter - 1 ) ), ( $counter - 1 ) );
        foreach ( $random_numbers as $random_number )
            unset( $sidebars_widgets[$sidebar_id_to_target][$random_number] );
    }

    return $sidebars_widgets;
});

相关推荐

Displaying Widgets

在主题开发期间,我了解如何在functions.php 文件然而,当谈到在主题中显示小部件时,是否有一种首选的方式来显示它们-primary,使用the_widget() 功能与dynamic_sidebar() 作用