方法OpenMods
您在下面看到的,应该是由fgetcsv
函数,并将其放入HTML表中。__construct
通常情况下,应该定义类的属性,并且shortcode
应该从短代码中获取两个属性,如果mods返回,应该调用类中的另一个函数。
OpenMods
当它在类之外时,没有类属性调用,所以我很确定这不是问题的根源。我的问题很可能在于__construct
和shortcode
; 然而,请不要忽视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();
}
}
最合适的回答,由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进行简单检查,以查看它是否已经被调用。