我试图添加将用户重定向到随机产品/页面/帖子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\' );
最合适的回答,由SO网友:Jacob Peattie 整理而成
使用短代码是错误的。短代码用于输出内容,而不是处理重定向之类的事情。
我们需要做的是:
为创建重写规则/random/
将触发重定向的URL当/random/
访问URL时,获得一个随机帖子/页面/产品/并用302重定向到其URL对于步骤1,我们将使用rewrite 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/
将重定向到该类型的随机帖子。