web-dev-qa-db-fra.com

Adapter PHP Formulaire d'action pour WordPress?

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>';
        }
    }
}
?>
1
James

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

0
Mohammad Limon