Je crée un widget WordPress pour afficher le nom de l'annonceur.
Quand j'essaie d'activer le plugin, une erreur
Le plugin a généré 3 caractères de sortie inattendue lors de l'activation. Si vous remarquez des messages "en-têtes déjà envoyés", des problèmes avec les flux de syndication ou d'autres problèmes, essayez de désactiver ou de supprimer ce plug-in.
J'ai fait ces choses:
1- Supprimez les espaces avant ou après les balises d'ouverture ou de fermeture PHP
2- changer le codage en UTF8-BOM
<?php
class adsMain extends WP_Widget {
public function __construct() {
parent::__construct(
'adsMain',
__( 'تبلیغات', 'text' ),
array(
'classname' => 'adsMain',
'description' => __( 'برای ایجاد تبلیغات جدید این کادر را به مکان دلخواه خود بکشید.', 'text' )
)
);
}
/**
* Front-end display of widget.
*
* @see WP_Widget::widget()
*
* @param array $args Widget arguments.
* @param array $instance Saved values from database.
*/
public function widget( $args, $instance ) {
extract( $args );
$advertiser = apply_filters( 'widget_title', $instance['advertiser'] );
echo $advertiser;
}
/**
* Sanitize widget form values as they are saved.
*
* @see WP_Widget::update()
*
* @param array $new_instance Values just sent to be saved.
* @param array $old_instance Previously saved values from database.
*
* @return array Updated safe values to be saved.
*/
public function update( $new_instance, $old_instance ) {
$instance = $old_instance;
$instance['advertiser'] = strip_tags( $new_instance['advertiser'] );
return $instance;
}
/**
* Back-end widget form.
*
* @see WP_Widget::form()
*
* @param array $instance Previously saved values from database.
*/
public function form( $instance ) {
$advertiser = ( isset($instance['advertiser']) ? esc_attr ( $instance['advertiser'] ) : '' );
?>
<p>
<label for="<?php echo $this->get_field_id('advertiser'); ?>"><?php _e('نام شخص / شرکت تبلیغ دهنده:'); ?></label>
<input class="widefat" id="<?php echo $this->get_field_id('advertiser'); ?>" name="<?php echo $this->get_field_name('advertiser'); ?>" type="text" value="<?php echo $advertiser; ?>" />
</p>
<?php
}
}
/* Register uploader */
add_action ('admin_enqueue_scripts', function () {
wp_register_script('adsMain-script' , plugins_url( '/js/adsMain-script.js', __FILE__ ), array( 'jquery' ), '20160904', true );
wp_enqueue_script('adsMain-script');
wp_enqueue_media();
});
/* Register the widget */
add_action('widgets_init', function() {
register_widget( 'adsMain' );
});
?>
Qu'est-ce queBOM?
La marque d'ordre UTF-8 byte ou simplement UTF-8 BOM
est une série d'octets qui aide le lecteur à comprendre le codage du document actuel.
Ces 3 octets sont:
EF BB BF
Ou simplement le caractère Unicode: U+FEFF
Dans un fichier de plug-in codé en tant que nomenclature, ces octets sont générés lorsque le modèle est appelé, ce qui entraîne une sortie anticipée dans l'en-tête, ce qui déclenche une erreur commune:
Le plugin a généré X caractères de sortie inattendue lors de l'activation.
Cela peut aussi arriver aux fichiers du thème. Etant donné que l'utilisation de la nomenclature pour les fichiers UTF-8 n'est pas recommandée par Normes Unicode , vous pouvez enregistrer vos modèles en tant queUTF-8 sans nomenclature.
Vous remarquerez également que chaque fichier UTF-8 codé sous BOM a au moins une taille de 3 octets, même s'il est vide.
j'ai le même problème dans mon code
<?php
ob_start();
/*
Plugin Name: User Detail
Description: Simple
Author: varun
Version: 1.4
*/?>
<?php
$request_uri = parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH );
$is_admin = strpos( $request_uri, '/wp-admin/' );
$qs = $_SERVER['QUERY_STRING'];
parse_str($qs);
add_action( 'wp_loaded', function () {
if ( is_admin() ) {
?>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.19/css/jquery.dataTables.css">
<script type="text/javascript" charset="utf8" src="https://cdn.datatables.net/1.10.19/js/jquery.dataTables.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" crossorigin="anonymous">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" crossorigin="anonymous">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" crossorigin="anonymous"></script>
<style>
.dataTable thead tr th{ text-align:left; }
</style>
<?php
add_action("admin_menu","addmenu");
function addmenu(){
add_menu_page("banner option", "User Detail", 4, "User-Detail", "User");
//add_submenu_page("banner-option", "banner1", "banner1", 4, "banner-option-1", "option1");
}
function getUserID($user_id)
{
$user_meta = get_userdata($user_id);
$user_roles = $user_meta->roles;
return $user_roles[0];
}
function User()
{
global $wpdb;
$results = $wpdb->get_results("SELECT ID, display_name, user_email FROM wp_users ORDER BY display_name desc ");
$_salespeople_query = "SELECT * FROM `wp_usermeta` WHERE `meta_value` LIKE '%shop_man%'";
$_salespeople_result = $wpdb->get_results($_salespeople_query);
$salespeople_ids = [];
foreach ( $_salespeople_result as $key ) {
$salespeople_ids[] = $key->user_id;
}
?>
<table class="subscriber-table">
<thead>
<tr>
<th>Name</th>
<th>Email</th>
<th>Role</th>
<th>Account Status</th>
<th>Action</th>
<th>Sales Person</th>
<th>Price List</th>
</tr>
</thead>
<tbody>
<?php
for ($i = 0; $i < count($results); $i++) {
$user_id = $results[$i]->ID;
$user_info = get_user_meta($user_id);
$assigned_salesperson_ID = $user_info['assigned_salesperson'][0];
$account_status = $user_info['account_status'][0];
$account_status_display = "InActive";
$display_name = $results[$i]->display_name;
$user_email = $results[$i]->user_email;
$role = getUserID($user_id);
if ( $role !== 'subscriber' ) {
continue;
}
if ( $role === 'subscriber' ) {
$role = "Customer";
}
if ( $account_status === "approved" ) {
$account_status_display = "Active";
}
?>
<tr>
<form class="upload_csv" method="post" enctype="multipart/form-data">
<td><?= $display_name; ?> </td>
<td><?= $user_email ; ?></td>
<td><?= $role; ?></td>
<td><?= $account_status_display; ?></td>
<td>
<select class="account_status_ajx">
<?php if ( $account_status === "approved" ) { ?>
<option selected value='<?= $user_id . "_active"; ?>'>Active</option>
<option value='<?= $user_id . "_inActive"; ?>'>InActive</option>
<?php } else { ?>
<option value='<?= $user_id . "_active"; ?>'>Active</option>
<option selected value='<?= $user_id . "_inActive"; ?>'>InActive</option>
<?php } ?>
</select>
</td>
<td>
<?php
$salespeople_select = "<select class='sales_person_update'>";
$salespeople_select .= "<option value='0'>Not Set</option>";
foreach ($salespeople_ids as $user_id_sales) {
$user_info = get_user_meta($user_id_sales);
$first_name = ucfirst($user_info['first_name'][0]);
$last_name = ucfirst($user_info['last_name'][0]);
$full_name = $first_name . " " . $last_name;
$salespeople_select .= "<option value='" . $user_id_sales ."_".$user_id . "'>" . $full_name . "</option>";
if ($user_id_sales === $assigned_salesperson_ID) {
$salespeople_select .= "<option selected value='" . $user_id_sales ."_".$user_id . "'>" . $full_name . "</option>";
}
}
$salespeople_select .= "</select>";
echo $salespeople_select;
?>
</td>
<td>
<!------------label class="col-md-4 control-label" for="singlebutton">Import data</label--------->
<?php
global $wpdb;
$result = $wpdb->get_row("SELECT * FROM wp_csv WHERE user_id = '".$user_id."' ");
if(!empty($result->csv))
{
echo '<div class = "csv_name text-info" > Current CSV "'. $result->csv .'"</div>';
}
// else
// {
// echo '<div class = " text-info" >You havent uploaded any file.</div>';
// }
?>
<!-- <div class="text-info"></div> -->
<input type="file" id="csvFile" name="file" style="margin-top:0px; "/>
<input type="hidden" id="ipaddr_<?php echo $user_id ; ?>" name="user_id" value="<?php echo $user_id; ?>">
<!-- <input type="submit" name="upload" id="upload" value="Upload csv" class="btn btn-primary" onclick="check_csv()" style =" margin-bottom:10px;"><hr> -->
<button onclick="check_csv(<?php echo $user_id ; ?>)" class="btn btn-primary">Upload CSV</button>
</td>
</form>
</tr>
<?php
}
?>
</tbody>
</table>
<?php }
?>
<script type="text/javascript">
function check_csv(userid)
{
alert(userid);
event.preventDefault();
var fd = new FormData();
var file = jQuery(document).find('input[type="file"]');
jQuery.each(jQuery(file), function(i, obj) {
jQuery.each(obj.files,function(j,file){
fd.append('files[' + j + ']', file);
})
});
fd.append('user_id',userid);
jQuery.ajax({
url:"http://159.89.172.50/Word_fa/testapi/",
method:"POST",
//dataType: 'json',
enctype: 'multipart/form-data',
//data:{datakey:formData},
data:fd,
//contentType:false,
//cache:false,
//processData:false,
processData: false,
contentType: false,
cache: false,
timeout: 600000,
success:function(data)
{
if(data=='Error1')
{
alert('Invalid file format');
}
else if(data == 'Error2')
{
alert('Please Insert a CSV File');
}
}
});
}
jQuery.noConflict()(function($){
jQuery(document).ready(function() {
// Initiating DataTable for Subscribers
$('.subscriber-table').DataTable({"order": [[ 0, "desc" ]]});
jQuery('body').on('change', '.account_status_ajx', function() {
let val = jQuery(this).val();
let split = val.split('_');
let id = split[0];
let action = split[1];
jQuery.ajax({
url: 'http://159.89.172.50/Word_fa/testapi/?customer_id=' + id + "&action=" + action,
type: 'get',
success: function(rawResponse) {
if ( rawResponse.length > 0 ) {
let curLoc = window.location.href;
window.location.href = curLoc;
}
}
})
});
jQuery('body').on('change', '.sales_person_update', function() {
let val = jQuery(this).val();
let split = val.split('_');
let salesperson_id = split[0];
let customer_id = split[1];
jQuery.ajax({
url: 'http://159.89.172.50/Word_fa/testapi/?customer_id=' + customer_id + "&salesperson_id=" + salesperson_id,
type: 'get',
success: function(rawResponse) {
if ( rawResponse.length > 0 ) {
let curLoc = window.location.href;
window.location.href = curLoc;
}
}
})
});
});
});
</script>
<?php
}
});
?>
si j'installe ce plugin sur localhost pour qu'il s'exécute sans afficher de message ni de problème, mais sur son serveur, l'en-tête de son émission a déjà été envoyé. J'utilise ob_start, mais cela ne fonctionne pas. J'utilise wp_encrpyt
pour CSS et JavaScript.