每周更改Wordpress页面内容

时间:2018-01-07 08:01:41

标签: php sql wordpress wordpress-shortcode

我有一个Wordpress页面,其中包含餐厅的每周菜单,使用Quick Restaurant Menu插件构建。

菜单每周更改一次,直到最多6周,然后返回第一个菜单并重新开始。

使用的短代码是:@Embedded

现在,只需在短代码内更改ID即可显示下周的菜单。

是否有一种php方法可以使用cron或WordPress插件更改SQL中的页面内容以安排它自行运行?

1 个答案:

答案 0 :(得分:1)

虽然使用WordPress cron更改帖子内容是可能的,但创建自定义短代码以生成定期修改的结束短代码更为强大。

这使您能够直接从WordPress页面/帖子编辑屏幕更改短代码标记,参数(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] );
  • id="%2$s" %2$s $shortcode = "'" . sprintf( '[%1$s中将 id="%2$s"更改为]', $attributes['shortcode'], $args[ $rotation ] );

[shortcode foo='bar' id='2039' color='#cc000000']时,这会为结束短代码提供参数字符串$rotation = 0;