我需要从短代码中提取变量但是我被卡住了

时间:2016-01-21 17:37:29

标签: php arrays wordpress extract shortcode

所以这就是我正在做的事情:

我的帖子只包含嵌入视频的短代码:

  

[video width =“1280”height =“720”mp4 =“http://myurl/wp-content/uploads/2016/01/VID_20160114_202806.mp4”] [/ video]

我想要的只是“mp4”变量,除了根据编码可能有不同的名称,所以假设我只需要[2]值。

请记住,上面的短代码就是帖子里面的全部内容。这是我的所作所为:

 $atts = array();
 $atts = shortcode_parse_atts( $post->post_content );
 //then I use $atts[2];
这是悲惨的失败。 我收到以下通知:Undefined offset: 2

如果我运行print_r,这是我得到的扭曲数组:

Array
(
    [0] => [video
    [width] => 1280
    [height] => 720
    [1] => mp4=" http:="" myurl="" wp-content="" uploads="" 2016="" 01="" vid_20160114_202806.mp4"][="" video]

(诚然,由于它是在一个html标签中打印出来的,所以这会引起所有这些引用;点是,参数的提取失败了)

我认为$post->post_content不是shortcode_parse_atts想要的。它需要一串属性。但是,我如何获得属性串? (我知道,正则表达式,对吧?)

2 个答案:

答案 0 :(得分:2)

这就是设置短代码的方法:

function my_shortcode($atts){
    $atts = shortcode_parse_atts(array(
         //default values go here.  
    ), $atts);
}

现在您应该按照预期正确接收这些值,并且可以使用$atts['width']$atts['height']$atts['mp4']来访问这些值。

答案 1 :(得分:0)

谢谢Ohgodwhy,我意识到这是可行的方法。但是它会产生问题,因为第三个值可能具有不同的名称,具体取决于视频的编码。

然而我用正则表达式解决了(我不想...因为懒惰......)

describe('The directive', function() {
    var element,
        scope,
        theController;

    beforeEach(module('app'));
    beforeEach(module('path/to/theDirective'));

    beforeEach(inject(function($compile, $rootScope) {
        element = angular.element('<div args="args" the-directive ></div>');
        scope = $rootScope;
        $compile(element)(scope);
        scope.args = {
            availableValues : [1, 2, 3],
            key : 'id',
            selectedValues : [],
            searchText : '',
            flag: false
        };
        scope.$digest();    
        theController = element.controller('theDirective');     
        scope = element.isolateScope() || element.scope();
    }));

    it('should compile', function() {
        expect(element.html()).not.toBeNull();
    });

    describe('directive controller', function() {
        it('should exist', function() {
            expect(theController).not.toBeNull();
            expect(theController).toBeDefined();
            expect(scope.disableAddButton()).toBeDefined();
        });
    });
});