未从短码调用接收属性的方法,一般OOP问题

时间:2015-04-13 作者:Kreation

方法OpenMods 您在下面看到的,应该是由fgetcsv 函数,并将其放入HTML表中。__construct 通常情况下,应该定义类的属性,并且shortcode 应该从短代码中获取两个属性,如果mods返回,应该调用类中的另一个函数。

OpenMods 当它在类之外时,没有类属性调用,所以我很确定这不是问题的根源。我的问题很可能在于__constructshortcode; 然而,请不要忽视OpenMods,因为它可能包含导致问题的错误,我只是给出了我的估计,因为我不得不寻求帮助,所以我的估计值不太高。

这是我尝试使用的快捷代码的一个示例:

[priceguide file=’test.csv’ type=’mods’]
<小时>
class CsvImporter
{   
    private $parse_header;
    private $header;
    private $delimiter;
    private $length;
    //--------------------------------------------------------------------
function __construct($parse_header=false, $delimiter="\\t", $length=8000)
 {
    add_shortcode( \'priceguide\', array( $this, \'shortcode\' ) );
    $this->parse_header = $parse_header;
    $this->delimiter = $delimiter;
    $this->length = $length;
}
    //--------------------------------------------------------------------
public function shortcode($atts) {
    $attributes = extract( shortcode_atts( array(
        \'file\' => \'\',
        \'type\' => \'\',
    ), $atts ));
    if ($attributes[\'mods\'])
    {
        $this->OpenMods($attributes[\'file\']);
    }
}
    //--------------------------------------------------------------------
    function OpenMods($file) {
    ob_start();
     $fp = fopen(plugin_dir_path( __FILE__ )  . $file , "r" );
    if ($this->parse_header)
    {
       $header = fgetcsv($fp, $this->length, $this->delimiter); 
    }
    // table header and search html
    echo(\'<input type="text" class="search" id="search" placeholder="Search">\');
    echo(\'<br>\');
    echo(\'<table id="table">    <tr class="hidden">
        <th><b>
            Name</b>
        </th>
        <th><b>
            Cheese</b>
        </th>
        <th><b>
            Price</b>
        </th>
        <th><b>Vote</b>
        </th>
    </tr>
    <tbody>\');
    // integer for drop down/price submit
    $a = 1;
    // set values for table data
    while ($header !== FALSE) {
        $name = $header[0];
        $quanid = $header[2];
        $table = $header[3];
        unset($header[2]);
        unset($header[3]);
        $cssId = \'row-\'.$a;
        $a++;
        //generate HTML
        echo(\'<tr>\');
        foreach ($header as $index=>$val) {
            echo(\'<td>\');
            echo htmlentities($val, ENT_QUOTES);
            echo(\'</td>\');  
        }
        // query to get item prices
        $sql = "SELECT ItemID, Price 
        FROM {$table}
        WHERE ItemID = %d
        GROUP BY Price
        ORDER BY COUNT(*) DESC LIMIT 1";
        global $wpdb;
        $results = $wpdb->get_var( $wpdb->prepare( $sql, $quanid));
        // put the results in the table
        echo(\'<td>\');
        print_r($results);
        echo(\'</td>\');
        // HTML for hidden row/price submission
        echo(\'<td>
            <button class="toggler" data-prod-cat="\' . $cssId . \'">Vote</button>
        </td>\');
        echo(\'</tr>\');
        echo(\'<tr class="cat\' . $cssId . \' hidden" style="display:none">\');
        echo(\'<td colspan="4" style="white-space: nowrap">Enter \' . $name . \' Price:
        <form action="" name="form\' . $quanid . \'" method="post"><input type="text" id="\' . $quanid . \'" maxlength="4" name="\' . $quanid . \'" value="price_input" class="input" />
        <button id="submit" name="submit" class="submit" type="submit" value="Submit">Submit</button></form>
        <?php
  ?>
        </td>
        </tr>\');
        wp_nonce_field(\'price_input\');
    }
    echo("</table>");
    fclose($fp);
    return ob_get_clean();
    }
}

2 个回复
最合适的回答,由SO网友:cybmeta 整理而成

首先,你必须开始上课,比如:

add_action( \'init\', function() {

     $CsvImporter = new CsvImporter;

} );
此外,您正在使用extract() 错误的extract() 无法生成$attributes 作为数组。无论如何extract() 不再推荐使用,您应该避免使用它。另外,请注意if ($attributes[\'mods\']) 应该是if ($attributes[\'type\'] == \'mods\')mods 不是中的有效索引$attributes 数组,但type 指数此外,您需要return 短代码回调中的值。

我已经测试过这个短代码[priceguide file="test.csv" type="mods"] 它正在使用下面的代码(请注意,我已经更改了 短代码中的字符,不确定是否 是有效的值分隔符)。

add_action( \'init\', function() {

     $CsvImporter = new CsvImporter;

} );

class CsvImporter {   
    private $parse_header;
    private $header;
    private $delimiter;
    private $length;

    function __construct($parse_header=false, $delimiter="\\t", $length=8000) {
        add_shortcode( \'priceguide\', array( $this, \'shortcode\' ) );
        $this->parse_header = $parse_header;
        $this->delimiter = $delimiter;
        $this->length = $length;
    }

    public function shortcode($atts) {
        $attributes = shortcode_atts( array(
           \'file\' => \'\',
           \'type\' => \'\',
        ), $atts );

        if ( $attributes[\'type\'] == "mods" ) {
            return $this->OpenMods($attributes[\'file\']);
        }
    }

    function OpenMods($file) {
        return "test";
    }
}
PD:在开发过程中,你应该WP_DEBUG 设置为on,显示错误也设置为on;这样你就会看到一条警告信息说$attributes[\'mods\'] 未设置。

SO网友:Jon Limitless

您可能总是需要检查要调用的类的初始化,这似乎是您的问题。在您的情况下,您可以随时简单地调用包含的类,如下所示:

$csvImporter = new CsvImporter($parse_header, $delimiter, $length);
或者,如果您将类添加到WordPress初始化挂钩中,例如插件格式。

add_action(\'init\', array($this, \'CsvImporter\'));
还请注意,如果类已经存在,您可能需要使用函数function\\u exists进行简单检查,以查看它是否已经被调用。

结束

相关推荐

Iterate through ID's in loop

我已经基于category创建了一个自定义循环,现在我想运行一个函数,将当前帖子的特定ID作为参数进行迭代。我有。。$secondary_loop = new WP_Query(array( \'category_name\' => get_the_title(), \'posts_per_page\' => 5 )); while ( $secondary_loop->have_posts() ) : $secondary_loop->the_post();&#x