WordPress 302重定向至随机产品/帖子/页面

时间:2018-11-24 作者:T. Thomas

我试图添加将用户重定向到随机产品/页面/帖子url的功能,类似于示例。com/page/random,将重定向到示例。com/page/one of many。

这个问题不是针对WooCommerce的,因为。。。

A、 这个问题是关于查找随机的产品/页面/帖子url

B、 这个问题是关于302从短代码重定向到a中的url。

C、 碰巧我在寻找产品类型。

我的猜测是,我需要使用一个自定义的短代码([random_product_page]),它将被302重定向所取代。

My Questions:

1. How do I retrieve the list of published product/page/post urls and pick one randomly.

2. How should the 302 redirect work?

3. How should this work within function.php, should it even go in function.php.

到目前为止,我正在尝试向我的子主题的函数中添加一个函数。php使用上述短代码重定向页面,但只能用任意字符串替换短代码。

如果有更好的方法来处理这个问题,请让我知道。Wordpress的开发对我来说还是很新的。

It has to be a full redirect, example.com/page/random can\'t just display a random page, the url needs to change so that page view can be tracked.

解决方案:

//Custom Code for a Random Endpoints
function random_endpoint() {
        add_rewrite_endpoint( \'random\', EP_ROOT );
}
add_action( \'init\', \'random_endpoint\' );

function random_redirect() {
// If we have accessed our /random/ endpoints.
$post_type = get_query_var( \'random\' );
if ( $post_type == \'\' ) {
    $post_type = [ \'post\', \'page\', \'product\' ];
}
if ( get_query_var( \'random\', false ) !== false ) {
    // Get a random post.
    $random_post = get_posts( [
            \'numberposts\' => 1,
            \'post_type\'   => $post_type,
            \'orderby\'     => \'rand\',
        ] );

        // If we found one.
        if ( ! empty( $random_post ) ) {
            // Get its URL.
            $url = esc_url_raw( get_the_permalink( $random_post[0] ) );

            // Escape it.
            $url = esc_url_raw( $url );

            // Redirect to it.
            wp_safe_redirect( $url, 302 );
            exit;
        }
    }
}
add_action( \'template_redirect\', \'random_redirect\' );

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

使用短代码是错误的。短代码用于输出内容,而不是处理重定向之类的事情。

我们需要做的是:

为创建重写规则/random/ 将触发重定向的URL/random/ 访问URL时,获得一个随机帖子/页面/产品/并用302重定向到其URLrewrite endpoints API 注册/random/ 指向主URL的端点,以便http://example.com/random/ 是我们可以访问的URL:

function wpse_320084_random_endpoint() {
    add_rewrite_endpoint( \'random\', EP_ROOT );
}
add_action( \'init\', \'wpse_320084_random_endpoint\' );
请确保访问“设置”>“永久链接”以刷新永久链接,否则将无法工作。

然后我们会template_redirect 因此,如果用户访问我们的URL,我们可以将其重定向到随机帖子:

function wpse_320084_random_redirect() {
    // If we have accessed our /random/ endpoints.
    if ( get_query_var( \'random\', false ) !== false ) {
        // Get a random post.
        $random_post = get_posts( [
            \'numberposts\' => 1,
            \'post_type\'   => [ \'post\', \'page\', \'product\' ],
            \'orderby\'     => \'rand\',
        ] );

        // If we found one.
        if ( ! empty( $random_post ) ) {
            // Get its URL.
            $url = esc_url_raw( get_the_permalink( $random_post[0] ) );

            // Escape it.
            $url = esc_url_raw( $url );

            // Redirect to it.
            wp_safe_redirect( $url, 302 );
            exit;
        }
    }
}
add_action( \'template_redirect\', \'wpse_320084_random_redirect\' );
如果您想为每个帖子类型指定一个单独的URL,那么可以使用访问端点之后传递的任何内容get_query_var():

function wpse_320084_random_redirect() {
    $post_type = get_query_var( \'random\' );

    if ( post_type ) {
        $random_post = get_posts( [
            \'numberposts\' => 1,
            \'post_type\'   => $post_type,
            \'orderby\'     => \'rand\',
        ] );

        if ( ! empty( $random_post ) ) {
            $url = esc_url_raw( get_the_permalink( $random_post[0] ) );
            $url = esc_url_raw( $url );

            wp_safe_redirect( $url, 302 );
            exit;
        }
    }
}
add_action( \'template_redirect\', \'wpse_320084_random_redirect\' );
使用该代码,/random/post/ 将加载随机帖子,/random/page/ 将加载随机页面/random/product/ 将加载随机产品。之后发送的任何帖子类型/random/ 将重定向到该类型的随机帖子。

结束

相关推荐

Redirection on domain name

我目前正在调试一个荷兰WP网站https://glaszetterdirect.nl问题是,我从以下位置收到了不需要的重定向:http://www.glaszetterdirect.nl 到https://glaszetterdirect.nl/wp-admin我真的不明白发生了什么事。我已经检查了以下内容:.htaccesswp-config.phpwp_options db表格(siteurl 和home 两者:https://glaszetterdirect.nl)</已选中并删除wp_old