J'ai un formulaire PHP que je souhaiterais adapter pour WordPress. J'ai parcouru et créé un plugin qui crée un widget et un formulaire. L'action de formulaire va dans un fichier que j'ai créé, appelé listrak-newsletter-api.php
, mais lorsque je le soumets dans le formulaire ci-dessous, j'obtiens une erreur 404.
Ces fichiers sont tous situés dans mon répertoire /wp-content/plugins/listrak-newsletter-api
.
Seul, en dehors de WordPress, cela fonctionne très bien. Mais depuis qu'il a migré dans WordPress, il devient assez compliqué. J'avais une simple page HTML avec un formulaire qui avait une action de formulaire sur listrak-newsletter-api.php
et qui fonctionnait très bien. Mais intégrer cela dans WordPress semble l’avoir rendu un peu plus difficile qu’il ne devrait l’être.
Maintenant, je veux le garder comme un widget, car je peux placer le widget où je veux, dans la barre latérale du thème WordPress. Où il apparaît et comment il apparaît lorsque je l’active, c’est génial. La fonctionnalité doit simplement fonctionner.
Ce fichier est /wp-content/plugins/listrak-newsletter-api/plugin.php
:
<?php
/**
* Plugin Name: Listrak Newsletter API
* Description: Newsletter integration with Listrak.
* Version: 1.0
*/
// Register and load the widget
function wpb_load_widget()
{
register_widget('wpb_widget');
}
add_action('widgets_init', 'wpb_load_widget');
// Creating the widget
class wpb_widget extends WP_Widget
{
function __construct()
{
parent::__construct(
// Base ID of your widget
'wpb_widget',
// Widget name will appear in UI
__('WPBeginner Widget', 'wpb_widget_domain'),
// Widget description
array(
'description' => __('Sample widget based on WPBeginner Tutorial', 'wpb_widget_domain')
));
}
// Creating widget front-end
public function widget($args, $instance)
{
$title = apply_filters('widget_title', $instance['title']);
// before and after widget arguments are defined by themes
echo $args['before_widget'];
// This is where you run the code and display the output
echo '<div class="block-title"><span>EMAIL NEWSLETTER</span></div>';
echo '<form action="/wp-content/plugins/listrak-newsletter-api.php" method="post">';
echo ' <div class="tnp-field tnp-field-email"><label>Email</label>';
echo ' <input class="email" name="email" required="" type="email"></div>';
echo ' <div class="tnp-field tnp-field-button"><input class="tnp-submit" value="Subscribe now!" type="submit"></div>';
echo '</form>';
echo $args['after_widget'];
}
// Widget Backend
public function form($instance)
{
if (isset($instance['title'])) {
$title = $instance['title'];
} else {
$title = __('New title', 'wpb_widget_domain');
}
// Widget admin form
?>
<p>
<label for="<?php
echo $this->get_field_id('title');
?>"><?php
_e('Title:');
?></label>
<input class="widefat" id="<?php
echo $this->get_field_id('title');
?>" name="<?php
echo $this->get_field_name('title');
?>" type="text" value="<?php
echo esc_attr($title);
?>" />
</p>
<?php
}
// Updating widget replacing old instances with new
public function update($new_instance, $old_instance)
{
$instance = array();
$instance['title'] = (!empty($new_instance['title'])) ? strip_tags($new_instance['title']) : '';
return $instance;
}
} // Class wpb_widget ends here
?>
Ce fichier est /wp-content/plugins/listrak-newsletter-api/listrak-newsletter-api.php
:
<?php
$Host = $_SERVER['HTTP_Host'];
if (isset($_POST['action'])) {
$email = $_POST['email']; //obtain email from post, place into $email variable
$email = filter_var($email, FILTER_SANITIZE_EMAIL); //sanitizing email
//$theAction = $_POST['action'];
//wpSubscription($Host, $email, $theAction);
//$redirect = $_POST['redirect'];
//header('Location: ' . $redirect);
if ($_POST['email'] == '') {
echo "Please enter an email address";
}
if ($Host == network_site_url()) {
$sh_param = array( //setting username & password array
'UserName' => "",
'Password' => ""
);
$authvalues = new SoapVar($sh_param, SOAP_ENC_OBJECT); //encoding username and password array
$headers[] = new SoapHeader("http://webservices.listrak.com/v31/", 'WSUser', $sh_param);
$soapClient = new SoapClient("https://webservices.listrak.com/v31/IntegrationService.asmx?WSDL", array(
'trace' => 1,
'exceptions' => true,
'cache_wsdl' => WSDL_CACHE_NONE,
'soap_version' => SOAP_1_2
));
$soapClient->__setSoapHeaders($headers);
$params = array( //parameters for soap xml integration with listrak
'WSContact' => array(
'EmailAddress' => $email,
'ListID' => ''
),
'ProfileUpdateType' => 'Overwrite',
'ExternalEventIDs' => '',
'OverrideUnsubscribe' => true
);
try {
$rest = $soapClient->SetContact($params); //using SetContact method, send parameters
}
catch (SoapFault $e) { //if an error occurs, display it
echo '<pre>';
print($e->getMessage());
echo '</pre>';
}
}
}
?>
Je pense que votre URL d'action est fausse. Avez-vous essayé avec <?php echo plugins_url( 'listrak-newsletter-api.php', __FILE__ ); ?>
comme ceci echo '<form action="' . plugins_url( 'listrak-newsletter-api.php', __FILE__ ) . '" method="post">';
sur votre code
Quoi qu’il en soit, je vous ai quand même recommandé d’utiliser WP Ajax pour le faire. Pour plus d’informations, cliquez ici https://codex.wordpress.org/AJAX_in_Plugins