每周更改 Wordpress 页面内容
Change Wordpress page content weekly
我有一个带有餐厅每周菜单的 Wordpress 页面,使用 Quick Restaurant Menu 插件构建。
菜单每周更换一次,最多 6 周,然后 returns 第一个,然后重新开始。
使用的简码是:[erm_menu_fullweek id=11910]
现在,只需要在短代码中更改 ID 即可显示下周菜单。
是否有 php 方法来使用 cron 或 WordPress 插件更改 SQL 中的页面内容,以自行将其安排到 运行?
虽然使用 WordPress cron 更改 post 内容是可能的,但创建自定义简码以生成定期修改的结束简码更强大。
这使您能够直接从 WordPress page/post 编辑屏幕更改短代码标签、参数 (ID)、开始日期、间隔持续时间,而无需触摸任何代码。
使用自定义短代码 [mm1707_shortcode_rotator]
生成最终的短代码。如果将来更改结束短代码或更改要轮换的 ID,这将很有用。如果您的最终简码需要,您也可以在该简码之间包含内容。
示例 1:[mm1707_shortcode_rotator shortcode="erm_menu_fullweek" args="1,2,3,4,5,6,7" start_date="2018-01-08" interval="1 week"]
示例 2:[mm1707_shortcode_rotator shortcode="erm_menu_fullweek" args="1,2,3,4,5,6,7" start_date="2018-01-08" interval="1 week"] some content here [/mm1707_shortcode_rotator]
如果您的最终简码也需要一些内容。
<?php
/**
* Custom shortcode which generates another supplied shortcode with ID argument swapped per
* specified time interval.
*
* @param array $atts {
* Array of attributes specifiying shortcode, arguments to rotate and time interval.
*
* @type string $shortcode Shortcode to execute.
* @type string $args Comma seperated arguments to rotate per interval period.
* @type string $start_date Date from which rotation should be counted.
* @type string $intereval Interval for rotation. Expects relative dates.
* See http://php.net/manual/de/datetime.formats.relative.php.
* }
* @param string $content Optional. Content passed to shortcode.
* @return string|bool Returns output of supplied shortcode with ID argument
* as per calculated period or false when $shortcode and $args are not supplied
*/
function mm1707_shortcode_rotator( $atts = [], $content = null ) {
if ( empty( $atts['shortcode'] ) || empty( $atts['args'] ) ) {
return false;
}
// Normalize attribute keys, lowercase.
$atts = array_change_key_case( (array) $atts, CASE_LOWER );
// Convert IDs from string to array.
$args = explode( ',', $atts['args'] );
$args = array_map( 'trim', array_filter( $args ) );
// Override default attributes with user attributes.
$attributes = shortcode_atts(
[
'shortcode' => '',
'args' => array(),
'start_date' => '',
'interval' => '1week', // Expects relative dates. See http://php.net/manual/de/datetime.formats.relative.php.
], $atts
);
// Get the start date, if empty then first date of current year would be used.
$start_date = empty( $attributes['start_date'] ) ? new DateTime( '1 Jan' ) : new DateTime( $attributes['start_date'] );
// Get the rotation interval.
$rotation_interval = $attributes['interval'];
$rotation_interval = DateInterval::createFromDateString( $rotation_interval );
// Create DatePeriod and iterate over it to count ocurrences.
$rotation_period = new DatePeriod( $start_date, $rotation_interval, new DateTime() );
$args_count = count( $args );
$rotation = 0;
foreach ( $rotation_period as $date ) {
$rotation++;
if ( $rotation > $args_count - 1 ) {
$rotation = 0;
}
}
// Build shortcode.
$shortcode = sprintf( '[%1$s id="%2$s"]', $attributes['shortcode'], $args[ $rotation ] );
if ( ! empty( $content ) ) {
$content = apply_filters( 'the_content', $content );
$shortcode .= $content . '[/' . $attributes['shortcode'] . ']';
}
// Start output & return it.
return do_shortcode( $shortcode );
}
add_shortcode( 'mm1707_shortcode_rotator', 'mm1707_shortcode_rotator' );
此代码将进入您主题的 functions.php
文件
注意:此代码已经过测试并且可以完美运行。
更进一步
您可以安全地升级此代码,将参数数组作为字符串传递,而不仅仅是 ID。
例如,您可以即兴创作接受多维数组的逻辑 args="foo:'bar',id:'2039',color:'#CC000000'|foo:'bar2',id:'1890',color:'#FFF'"
。
- 首先通过
|
解析以使用 explode('|', $args);
获得旋转参数。
- 然后简单地做
str_replace( array(':',','), array('=', ' '), $args[$rotation] );
- 在
$shortcode = "'" . sprintf( '[%1$s
id="%2$s"
[=中将id="%2$s"
改为%2$s
23=].
当 $rotation = 0
;
时,这将为您提供结束简码的参数字符串作为 [shortcode foo='bar' id='2039' color='#cc000000']
我有一个带有餐厅每周菜单的 Wordpress 页面,使用 Quick Restaurant Menu 插件构建。
菜单每周更换一次,最多 6 周,然后 returns 第一个,然后重新开始。
使用的简码是:[erm_menu_fullweek id=11910]
现在,只需要在短代码中更改 ID 即可显示下周菜单。
是否有 php 方法来使用 cron 或 WordPress 插件更改 SQL 中的页面内容,以自行将其安排到 运行?
虽然使用 WordPress cron 更改 post 内容是可能的,但创建自定义简码以生成定期修改的结束简码更强大。
这使您能够直接从 WordPress page/post 编辑屏幕更改短代码标签、参数 (ID)、开始日期、间隔持续时间,而无需触摸任何代码。
使用自定义短代码 [mm1707_shortcode_rotator]
生成最终的短代码。如果将来更改结束短代码或更改要轮换的 ID,这将很有用。如果您的最终简码需要,您也可以在该简码之间包含内容。
示例 1:[mm1707_shortcode_rotator shortcode="erm_menu_fullweek" args="1,2,3,4,5,6,7" start_date="2018-01-08" interval="1 week"]
示例 2:[mm1707_shortcode_rotator shortcode="erm_menu_fullweek" args="1,2,3,4,5,6,7" start_date="2018-01-08" interval="1 week"] some content here [/mm1707_shortcode_rotator]
如果您的最终简码也需要一些内容。
<?php
/**
* Custom shortcode which generates another supplied shortcode with ID argument swapped per
* specified time interval.
*
* @param array $atts {
* Array of attributes specifiying shortcode, arguments to rotate and time interval.
*
* @type string $shortcode Shortcode to execute.
* @type string $args Comma seperated arguments to rotate per interval period.
* @type string $start_date Date from which rotation should be counted.
* @type string $intereval Interval for rotation. Expects relative dates.
* See http://php.net/manual/de/datetime.formats.relative.php.
* }
* @param string $content Optional. Content passed to shortcode.
* @return string|bool Returns output of supplied shortcode with ID argument
* as per calculated period or false when $shortcode and $args are not supplied
*/
function mm1707_shortcode_rotator( $atts = [], $content = null ) {
if ( empty( $atts['shortcode'] ) || empty( $atts['args'] ) ) {
return false;
}
// Normalize attribute keys, lowercase.
$atts = array_change_key_case( (array) $atts, CASE_LOWER );
// Convert IDs from string to array.
$args = explode( ',', $atts['args'] );
$args = array_map( 'trim', array_filter( $args ) );
// Override default attributes with user attributes.
$attributes = shortcode_atts(
[
'shortcode' => '',
'args' => array(),
'start_date' => '',
'interval' => '1week', // Expects relative dates. See http://php.net/manual/de/datetime.formats.relative.php.
], $atts
);
// Get the start date, if empty then first date of current year would be used.
$start_date = empty( $attributes['start_date'] ) ? new DateTime( '1 Jan' ) : new DateTime( $attributes['start_date'] );
// Get the rotation interval.
$rotation_interval = $attributes['interval'];
$rotation_interval = DateInterval::createFromDateString( $rotation_interval );
// Create DatePeriod and iterate over it to count ocurrences.
$rotation_period = new DatePeriod( $start_date, $rotation_interval, new DateTime() );
$args_count = count( $args );
$rotation = 0;
foreach ( $rotation_period as $date ) {
$rotation++;
if ( $rotation > $args_count - 1 ) {
$rotation = 0;
}
}
// Build shortcode.
$shortcode = sprintf( '[%1$s id="%2$s"]', $attributes['shortcode'], $args[ $rotation ] );
if ( ! empty( $content ) ) {
$content = apply_filters( 'the_content', $content );
$shortcode .= $content . '[/' . $attributes['shortcode'] . ']';
}
// Start output & return it.
return do_shortcode( $shortcode );
}
add_shortcode( 'mm1707_shortcode_rotator', 'mm1707_shortcode_rotator' );
此代码将进入您主题的 functions.php
文件
注意:此代码已经过测试并且可以完美运行。
更进一步
您可以安全地升级此代码,将参数数组作为字符串传递,而不仅仅是 ID。
例如,您可以即兴创作接受多维数组的逻辑 args="foo:'bar',id:'2039',color:'#CC000000'|foo:'bar2',id:'1890',color:'#FFF'"
。
- 首先通过
|
解析以使用explode('|', $args);
获得旋转参数。 - 然后简单地做
str_replace( array(':',','), array('=', ' '), $args[$rotation] );
- 在
$shortcode = "'" . sprintf( '[%1$s
id="%2$s"
[=中将id="%2$s"
改为%2$s
23=].
当 $rotation = 0
;
[shortcode foo='bar' id='2039' color='#cc000000']